序列化原始boost :: variant是否安全?

bdo*_*lan 6 c++ serialization boost shared-memory boost-variant

boost :: variant声称它是一个值类型.这是否意味着简单地写出boost :: variant的原始表示并稍后加载它是安全的,只要它只包含POD类型?假设它将由相同编译器编译的代码和相同版本的boost在同一架构上重新加载.

另外,(可能)等效地,可以在共享内存中使用boost :: variant吗?

spi*_*ama 15

尝试包括boost/serialization/variant.hpp; 它为你工作.


Mar*_*utz 7

关于序列化:它应该工作,是的.但是为什么不使用boost::variant访问机制来写出变体中包含的实际类型?

struct variant_serializer : boost::static_visitor<void> {
    template <typename T>
    typename boost::enable_if< boost::is_pod<T>, void>::type
    operator()( const T & t ) const {
        // ... serialize here, e.g.
        std::cout << t;
    }
};

int main() {

    const boost::variant<int,char,float,double> v( '1' );

    variant_serializer s;
    boost::apply_visitor( s, v );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

关于共享内存:boost::variant不执行堆分配,因此您可以将它放入共享内存中int,当然,假设正确同步.

毋庸置疑,如上所述,只有变量只能包含POD类型时,上述内容才有效.