在包含boost :: blank的变体上进行boost序列化

问题描述

我有一个boost :: variant,其中一个字段具有boost :: blank字段,在同一字段上使用boost :: serialise会引发错误提示错误:'boost中没有名为'serialize'的成员: :空白”

是否有办法通过在某个地方添加单独的boost :: blank函数来避免这种情况?

解决方法

是的,只需使用非成员序列化,也就是非侵入式序列化:

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&,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