繁体   English   中英

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

[英]How do you implement an encapsulated serialization in C++ without a macro?

我对此很疑惑。 我试图编写一个C ++类来序列化一个多态对象。 也就是说,我有一个

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

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

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

MACRO_FOR_INITIALIZING_STATIC_MEMBER(SomeClass<int, int>)

(不是其实际名称),并且C ++预处理器由于逗号而不喜欢此名称。 推杆

MACRO_FOR_INITIALIZING_STATIC_MEMBER((SomeClass<int, int>))

也不起作用,因为模板参数(即PolymorphicSerializable的“ T”)不能用括号括起来,并且带括号的版本最终作为模板参数。

关于这个还能做什么? 需要某种方式封装类映射的实现细节,但是怎么做呢? 没有宏,有没有办法做到这一点?

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

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

并在各处使用该吸气剂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM