yaLanTingLibs
|
兼容字段类型 更多...
#include <struct_pack_doc.hpp>
Public 成员函数 | |
constexpr | compatible (const compatible &other)=default |
constexpr | compatible (compatible &&other)=default |
constexpr | compatible (std::optional< T > &&other) |
constexpr | compatible (const std::optional< T > &other) |
constexpr compatible & | operator= (const compatible &other)=default |
constexpr compatible & | operator= (compatible &&other)=default |
静态 Public 属性 | |
static constexpr uint64_t | version_number = version |
友元 | |
bool | operator== (const compatible< T, version > &self, const compatible< T, version > &other) |
兼容字段类型
T | 兼容字段的类型 |
version | 兼容字段的版本号 |
这个类使用上类似于std::optional<T>
,但其语义是添加一个能够保持向前兼容的字段。
例如:
struct_pack::compatible
可以为空值,从而保证向前和向后的兼容性。 例如,序列化person_v2
,然后将其按照person_v1
来反序列化,多余的字段在反序列化时将会被直接忽略。 反过来说,序列化person_v1
,再将其按照person_v2
来反序列化,则解析出的person_v2
中的compatibale
字段均为空值。
compatible
字段的版本号可以省略,默认版本号为0。
升级接口时应注意保持版本号递增 原则:
1.新增加的compatible
字段的版本号,应该大于上一次增加的compatible
字段的版本号。
2.不得移除原来的任何一个compatible
字段(移除普通字段也会出错,但这种错误是可以被类型校验检查出来的)
假如违反这一原则,那么可能会引发未定义行为。 例如: