我想知道这件事。我试图编写一个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”)不能括在括号中,而括号内的版本最终会作为模板参数。
可以做些什么呢?需要有一些方法来封装类映射的实现细节 - 但是如何?有没有办法在没有宏的情况下做到这一点?
答案 0 :(得分:0)
除了可变参数宏之外,正如您对问题的评论所建议的那样,您可以将静态成员包装在getter函数中,因为它消除了为静态成员分别分配空间的要求:
template<class T>
class PolymorphicSerializable {
typedef SomeType<T> StaticInstanceType;
static StaticInstanceType& getContext() {
static StaticInstanceType instance;
return instance;
}
};
在任何地方使用吸气剂。