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 );
}
};