我有一个宏定义了一个带有可变参数的函数,宏有一些逻辑来决定必须调用哪个实函数。我目前的做法如下:
#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);\
}
答案 0 :(得分:0)
如果我们使用前两个代码块here中的EVAL
,帮助器和条件宏。我们可以创建一些递归宏来解析参数数组。
由于逗号是语法,我们需要将它转义为输出。
#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 I_WoT_R() I_WoT
#define I_WoT(t,v,n,...) \
v IS_DONE(n)( \
EAT \
, \
OBSTRUCT(COMMA)() \
OBSTRUCT(I_WoT_R)() \
)(n,__VA_ARGS__)
#define WithoutTypes(...) I_WoT(__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))
};
编译为(添加换行符后):
class AClass : public AInterface {
public:
int my_func(int a , int b ) {
if( something )
other_func(a , b );
return one_func(a , b );
}
};
希望有所帮助。