【发布时间】:2013-08-14 16:34:22
【问题描述】:
我有一组方法用于实例化和初始化一组对象。 它们看起来都差不多,除了传递给 Init 函数的参数数量:
ObjectType* CreateObjectType(Arg1 a1, Arg2 arg2, ... ArgN aN)
{
ObjectType* object = new ObjectType();
[...]
object->Init(this, a1, a2, ..., aN);
[...]
return object;
}
请注意,除了传递给 Init 函数之外,不得在任何地方使用这些参数。
我想找到一种方法来实现所有这些,而不必为每种对象类型复制代码。
我尝试使用可变参数宏,结果如下(无效):
#define CREATE_OBJECT_IMPL(ObjectType, ...) \
ObjectType* Create##ObjectType##(__VA_ARGS__) \
{ \
ObjectType* object = new ObjectType(); \
[...]
object->Init(this, ##__VA_ARGS__); \
[...]
return object; \
}
// This is the result I am trying to achieve :
CREATE_OBJECT_IMPL(MyFirstObject, bool, float)
CREATE_OBJECT_IMPL(MySecondObject, int)
CREATE_OBJECT_IMPL(MyThirdObject)
现在,在这个实现中,我使用了两次 VA_ARGS,两次都错误:
-
在第一种情况下,我想要一个具有我指定类型的参数列表(Arg1 a1,Arg2 a2...)
-
在第二种情况下,我想通过它们的名称来调用这些参数( Init(a1, a2...) )。
我尝试使用可变参数模板:
template< typename ObjectType, typename... Args >
ObjectType* CreateObject(Args args)
{
ObjectType* object = new ObjectType();
[...]
object->Init(this, args);
[...]
return object;
}
#define CREATE_OBJECT_IMPL(ObjectType, ...) \
ObjectType* Create##ObjectType##(__VA_ARGS__) \
{ \
return CreateObject<ObjectType, __VA_ARGS__>(__VA_ARGS__); \
}
...但这似乎也不起作用,我在模板定义行收到以下错误:
错误 C2143:语法错误:在 '...' 之前缺少 ','
错误 C2065:“Args”:未声明的标识符
我正在使用 VS2012。
我仍然可以为每个数量的参数编写 N 个类似的宏,但是我想知道是否有一种方法可以在不重复代码的情况下获得相同的结果?
【问题讨论】:
-
可变参数模板的签名应该是
template< typename ObjectType, typename... Args > ObjectType* CreateObject(Args... args);。但是你需要一些上下文来扩展参数包。 -
动态分配、哑指针、两阶段初始化?这是噩梦般的调试会话的秘诀。你应该马上逃跑。
标签: c++ variadic-templates variadic-macros