在包含 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 会在那里找到它

现场演示

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