在包含 boost::blank 的变体上提升序列化
boost Serialisation on a variant containing boost::blank
我有一个 boost::variant,其中一个字段有 boost::blank 字段,在同一个字段上使用 boost::serialise 会抛出一个错误,提示 error: no member named 'serialize' 在 'boost::blank'.
有没有办法通过在某处为 boost::blank 添加一个单独的函数来避免这种情况?
是啊,就用non-member序列化,a.k.a。 non-intrusive连载:
namespace boost { namespace serialization {
template <typename Ar> void serialize(Ar&, boost::blank&, unsigned) {}
} }
您还可以在命名空间 boost
中添加重载,因为 ADL 会在那里找到它
现场演示
#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
我有一个 boost::variant,其中一个字段有 boost::blank 字段,在同一个字段上使用 boost::serialise 会抛出一个错误,提示 error: no member named 'serialize' 在 'boost::blank'.
有没有办法通过在某处为 boost::blank 添加一个单独的函数来避免这种情况?
是啊,就用non-member序列化,a.k.a。 non-intrusive连载:
namespace boost { namespace serialization {
template <typename Ar> void serialize(Ar&, boost::blank&, unsigned) {}
} }
您还可以在命名空间 boost
中添加重载,因为 ADL 会在那里找到它
现场演示
#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