【发布时间】:2015-06-19 02:40:49
【问题描述】:
我正在尝试使用 boost 序列化创建一个游戏保存系统,并希望为客户端创建一个简单的方法来选择序列化的成员变量。
基本上我希望用户输入如下内容:
class apple : public Actor
{
public:
int a;
bool isTasty;
float unimportantData;
SET_SAVED_MEMBERS(a, isTasty);
};
我希望将其扩展为类似
class apple : public Actor
{
public:
// ...
template<typename Archive>
void serialize(Archive& arch, const unsigned int version)
{
arch & BOOST_SERIALIZATION_NVP(a);
arch & BOOST_SERIALIZATION_NVP(isTasty);
}
当然,如果它需要比这更多的宏也没关系。
我对模板元编程(最好)或预处理器元编程很好。
C++11 也不错。
感谢您的帮助!
【问题讨论】:
-
如果
BOOST_SERIALIZATION_NVP是一个 c 预处理器宏,你就没有机会使用模板参数,因为宏的评估将在模板扩展之前完成。但我也不明白你的问题是什么。你只想手工写更少的代码吗? -
正确。不过我现在有一些想法。一旦我看到有人 typedef 一个 boost::mpl 容器,然后编写一个宏来定义一个函数,该函数使用 fusion 来遍历元素。这可能吗?
-
@Klaus 我不确定我是否理解为什么这不能用模板来完成......只要宏没有做任何特别奇怪的事情,它应该在模板定义中扩展,然后扩展会被应用多次,不是吗?
-
是的,宏扩展是微不足道的。它将扩展到
::boost::serialization::make_nvp("a", a); -
我想到了一个使用可变参数模板参数的解决方案,但这不起作用,因为宏在模板扩展之前扩展。而且在宏中不可能有来自 vars 的“名称”,因为使用
<typename ... T> void X(T...a )定义的所有参数都有名称 a,这在这个用例中没有帮助。
标签: c++ metaprogramming template-meta-programming