【问题标题】:boost Serialisation on a variant containing boost::blankboost 对包含 boost::blank 的变体进行序列化
【发布时间】:2020-12-13 20:54:49
【问题描述】:
我有一个 boost::variant,其中一个字段有 boost::blank 字段,在同一字段上使用 boost::serialise 会引发错误 error: no member named 'serialize' in 'boost: :blank'.
有没有办法通过在某处为 boost::blank 添加单独的函数来避免这种情况?
【问题讨论】:
标签:
c++
boost
boost-serialization
boost-variant
【解决方案1】:
是的,只需使用非成员序列化,也就是非侵入式序列化:
namespace boost { namespace serialization {
template <typename Ar> void serialize(Ar&, boost::blank&, unsigned) {}
} }
您还可以在命名空间boost 中添加重载,因为 ADL 会在那里找到它
现场演示
Live On Coliru
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/variant.hpp>
#include <iostream>
using V = boost::variant<boost::blank, int>;
namespace boost { namespace serialization {
template <typename Ar> void serialize(Ar&, boost::blank&, unsigned) {}
} }
int main() {
V a{42}, b;
boost::archive::text_oarchive oa(std::cout);
oa << a << b;
}
打印例如
22 serialization::archive 17 1 0
0 1 42
1 0 0 0