C++ 有没有更简单的方法来执行宏以定义具有可变参数量的函数?

C++ 有没有更简单的方法来执行宏以定义具有可变参数量的函数?,c++,c-preprocessor,variadic-macros,C++,C Preprocessor,Variadic Macros,我有一个宏,它定义了一个参数数量可变的函数,宏有一些逻辑来决定必须调用哪个实函数。我目前的做法如下: #define FUNC(ret,args,args_call) \ ret my_func(args) { \ if( something ) other_func(args_call);\ return one_func(args_call);\ } #define PARAM(...) __VA_ARGS__ 我是这样用的: class A

我有一个宏,它定义了一个参数数量可变的函数,宏有一些逻辑来决定必须调用哪个实函数。我目前的做法如下:

#define FUNC(ret,args,args_call) \
    ret my_func(args) { \
        if( something ) other_func(args_call);\
        return one_func(args_call);\
    }
#define PARAM(...) __VA_ARGS__
我是这样用的:

class AClass : public AInterface {
public:
    FUNC(int,PARAM(int a, int b),PARAM(a,b))
};
我想知道是否有更好的方法

注意:声明的(
my_func
在我的示例中)函数将用于从超类重新实现一个方法,因此使用模板的方法(我知道的方法)不会解决我的问题

Edit2:即使使用适当的可变模板函数,我仍然需要宏来声明函数,因为它重写了超类中的函数

#define FUNC(ret,args,args_call) \
ret my_func(args) { \
    return proper_variadic_templated_function<ret>(args_call);\
}
#定义FUNC(ret、args、args#u调用)\
ret my_func(args){\
返回正确的变量模板函数(args调用)\
}

如果我们使用前两个代码块中的
EVAL
、helper和条件宏。我们可以创建一些递归宏来解析参数数组

由于逗号是语法性的,我们需要将其转义以进行输出

#define COMMA() ,
我们可以生成两个函数来将类型与名称分开

#define I_WT_R() I_WT
#define I_WT(t,v,n,...) \
    t v IS_DONE(n)(      \
        EAT               \
    ,                      \
       OBSTRUCT(COMMA)()    \
       OBSTRUCT(I_WT_R)()    \
    )(n,__VA_ARGS__)
#define WithTypes(...) I_WT(__VA_ARGS__,DONE)

将宏重新定义为:

#define FUNC(ret,args) EVAL(                           \
    ret my_func(WithTypes args) {                      \
        if( something ) other_func(WithoutTypes args); \
        return one_func(WithoutTypes args);            \
    })
允许您使用稍微好一点的语法:

class AClass : public AInterface {
public:
    FUNC(int,(int,a,int,b))
};
编译到(添加换行符后):


希望这能有所帮助。

我想Stackoverflow中可能有重复的地方,但我没有找到任何与此问题相关的内容,因为我不知道如何正确表达这个问题。你听说过可变模板吗?@AndréPuel为什么不编写一个适当的转发可变模板函数呢?你真的需要宏吗?对我来说,这似乎完全错了。。。为了得到一个好的答案,你可能应该描述你看到的实际问题,而不是询问你喜欢的解决方案。又名“你在问一个XY问题”。@Matstpeterson你来了
class AClass : public AInterface {
public:
    FUNC(int,(int,a,int,b))
};
class AClass : public AInterface {
public:
    int my_func(int a , int b ) {
        if( something )
            other_func(a , b );
        return one_func(a , b );
    }
};