c++ - boost MPL 以生成对象序列化代码?

标签 c++ boost metaprogramming template-meta-programming boost-mpl

我想为

生成序列化/反序列化代码
class Object
{
    string a;
    int b;
    long c;
    char d;
};

通过查看 mpl 序列,但我需要能够识别对象并将其取回,我无法弄清楚如何获取其成员的名称,我必须知道吗它?

代码应该是这样的

void SerializeObject(ostream os)
{
   serialize(object.a, os);
   serialize(object.b, os);

   //serialize(object.member, os);
}

我想通过用户只定义一个对应于对象布局的mpl序列来生成上面的代码,是否可行,你能给我一些提示吗?

我的目标是:

用户定义mpl::vector<String, int, long, char>对于上述对象和我的 metaprogram可以生成需要的编码。

最佳答案

考虑一个 boost::fusion,并使用宏 BOOST_FUSION_ADAPT_STRUCT() 将您的结构 boost 为 fusion 序列(随机访问),例如一旦你定义了上面的结构,你可以做类似的事情

BOOST_FUSION_ADAPT_STRUCT(
    Object,
    (std::string, a)
    (int, b)
    (long, c)
    (char, d)
)

现在它已经被 boost 了,你可以简单地使用一个for_each来遍历成员,像这样:

template<typename archive>
struct serializer {
   serializer(archive& ar):ar(ar) {}

   template<typename T>
   void operator()(const T& o) const {
      ar & o;  // assuming binary for example...
   }
   archive& ar;
};

template<typename archive, typename sequence>
void serialize(archive& ar, sequence const& v) {
   boost::fusion::for_each(v, serializer<archive>(ar));
}

要使用,它应该很简单:

Object foo; // instance to serialize
serialize(<archive>, foo);

关于c++ - boost MPL 以生成对象序列化代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6022459/

相关文章:

c++ - Boost 线程在作业完成之前就终止了

c++ - Boost Xcode C++ 命令行架构 x86_64 的 undefined symbol

ruby - 动态定义的类错误地共享数据 - 错误或编码错误?

c++ - 用于在 C 或 C++ 中创建树的结构对象变量的点运算符和箭头运算符之间的区别

c++ - MPI多项选择

c++ - 尝试使用 gcc 工具链构建 Boost

Ruby:猴子修补字符串类

c++ - 何时在 std::shared_lock 上使用 defer_lock?

c++ - 使用 boost::spirit 解析类似 c-struct 的声明

r - 剪接R中的bquote