相关疑难解决方法(0)

如何使用C预处理器连接两次并扩展宏,如"arg ## _ ## MACRO"?

我正在尝试编写一个程序,其中一些函数的名称依赖于某个宏变量的值,宏如下:

#define VARIABLE 3
#define NAME(fun) fun ## _ ## VARIABLE

int NAME(some_function)(int a);
Run Code Online (Sandbox Code Playgroud)

不幸的是,宏NAME()将其转化为

int some_function_VARIABLE(int a);
Run Code Online (Sandbox Code Playgroud)

而不是

int some_function_3(int a);
Run Code Online (Sandbox Code Playgroud)

所以这显然是错误的方式.幸运的是,VARIABLE的不同可能值的数量很小所以我可以简单地做一个#if VARIABLE == n并单独列出所有情况,但我想知道是否有一个聪明的方法来做到这一点.

c concatenation token c-preprocessor

141
推荐指数
3
解决办法
7万
查看次数

使用可变参数宏或模板来实现一组函数

我有一组用于实例化和初始化一组对象的方法.它们看起来几乎相同,除了传递给Init函数的参数数量:

ObjectType* CreateObjectType(Arg1 a1, Arg2 arg2, ... ArgN aN)
{
    ObjectType* object = new ObjectType();
    [...]
    object->Init(this, a1, a2, ..., aN);
    [...]
    return object;
}
Run Code Online (Sandbox Code Playgroud)

请注意,除了要传递给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)
Run Code Online (Sandbox Code Playgroud)

现在,在这个实现中,我使用VA_ARGS两次,两次都不正确:

  • 在第一种情况下,我想要一个包含我指定类型的参数列表(Arg1 a1,Arg2 a2 ......)

  • 在第二种情况下,我想通过它们的名称(Init(a1,a2 ...))来调用这些参数. …

c++ variadic-templates variadic-macros

5
推荐指数
1
解决办法
3018
查看次数