我有一组用于实例化和初始化一组对象的方法。它们看起来都差不多,除了传递给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 个类似的宏,但是我想知道是否有一种方法可以在不重复代码的情况下获得相同的结果?