SFINAE驱动条件式序列化框架
利用SFINAE检测类型是否具有特定成员函数,自动选择序列化路径(JSON/二进制),无需手动注册。 · 难度:入门 · +10XP
SFINAE驱动条件式序列化框架
使用std::void_t和declval实现类型特征检测:判断一个类型是否有serialize(Stream&)成员函数,或者可以用标准库的std::to_string/字符串流处理。本教程构建一个统一序列化接口,对不同类型自动分派不同实现,支持基本类型、STL容器、自定义类型。最后扩展为支持任意嵌套结构。
template<typename T, typename = void>
struct Serializer {
static void write(std::ostream& os, const T& val) {
os << val; // 默认使用<<
}
};
template<typename T>
struct Serializer<T, std::void_t<decltype(std::declval<T>().serialize(std::declval<std::ostream&>()))>> {
static void write(std::ostream& os, const T& val) {
val.serialize(os);
}
};