如何在没有宏的情况下在C ++中实现封装序列化?

时间:2016-07-23 04:02:03

标签: c++ serialization macros

我想知道这件事。我试图编写一个C ++类来序列化多态对象。也就是说,我有一个

template<class T>
class PolymorphicSerializable {
   ...
};

可以从可序列化的多态层次结构的根(也就是“T”成为根类)继承CRTP。它包含一个“静态”成员变量,它是工厂函数或函数对象的类名映射,可以在加载时构造保存的任何派生类的新实例(类的名称与数据一起保存)。 / p>

但是我遇到的问题是这个静态成员当然必须初始化。我现在这样做的方法是使用一些宏来填充这个样板。然而,问题是初始化那个静态我们当然需要模板参数,如果“T”是模板实例(即根类是一个模板实例),我会碰到像< / p>

MACRO_FOR_INITIALIZING_STATIC_MEMBER(SomeClass<int, int>)

(不是它的实际名称)和C ++预处理器因为逗号而不喜欢这个。把

MACRO_FOR_INITIALIZING_STATIC_MEMBER((SomeClass<int, int>))

不起作用,因为模板参数(即PolymorphicSerializable的“T”)不能括在括号中,而括号内的版本最终会作为模板参数。

可以做些什么呢?需要有一些方法来封装类映射的实现细节 - 但是如何?有没有办法在没有宏的情况下做到这一点?

1 个答案:

答案 0 :(得分:0)

除了可变参数宏之外,正如您对问题的评论所建议的那样,您可以将静态成员包装在getter函数中,因为它消除了为静态成员分别分配空间的要求:

template<class T>
class PolymorphicSerializable {
   typedef SomeType<T> StaticInstanceType;
   static StaticInstanceType& getContext() {
       static StaticInstanceType instance;
       return instance;
   }
};

在任何地方使用吸气剂。