通过宏将函数参数传递给函数

时间:2018-06-25 23:25:45

标签: c++ metaprogramming

我想创建一个宏,其中的参数之一是该宏内使用的函数的参数。

#define Macro(PERAMS, OTHER) \
    functionBeingUsed(PERAMS); \
    OTHER; 


Macro(1,2,3,4, int i = 0);

如您所见,您可以看到宏和函数同时使用了逗号。导致代码损坏。

我想知道是否有一种方法可以实现所需的结果,以便可以按以下方式解释代码。

Macro((1,2,3,4), int i = 0);

请注意,我没有使用C ++ 11。

5 个答案:

答案 0 :(得分:2)

每当您需要对预处理器进行不重要的操作时,都应立即跳转到Boost.PP库。在这里,BOOST_PP_REMOVE_PARENS宏似乎很重要:

#define Macro(PARAMS, OTHER) \
    functionBeingUsed(BOOST_PP_REMOVE_PARENS(PARAMS)); \
    OTHER; 

Macro((1,2,3,4), int i = 0);

或者,您可以只写functionBeingUsed PARAMS并使用传递的括号。

答案 1 :(得分:1)

无法执行您描述的操作。但是,您可以使用variadic macros做类似的事情。您需要将PARAMS部分放在末尾,并且看起来像以下内容:

#define Macro(OTHER, ...) \
    functionBeingUsed(__VA_ARGS__); \
    OTHER;

Macro(int i = 0, 1, 2, 3, 4);

答案 2 :(得分:0)

我相信唯一的答案是使用多个宏

#define MacroBegin \
   \\PreFunction

#define MacroEnd \
   \\PostFunction

MacroBegin
functionBeingCalled(1,2,3,4);
MacroEnd

答案 3 :(得分:0)

要区分哪些逗号属于宏本身以及哪些属于所调用的函数,必须将函数参数包装在括号中,例如:

Macro((1,2,3,4), int i = 0);

然后您必须从宏内部的函数调用中删除括号,因为括号将改为来自宏参数,例如:

#define Macro(PERAMS, OTHER) \
    functionBeingUsed PERAMS; \
    OTHER; 

所以,像这样:

Macro((1,2,3,4), int i = 0);

将解决此问题:

functionBeingUsed (1,2,3,4);
int i = 0; 

请记住,即使被调用的函数没有任何输入参数,也要加上括号:

Macro((), ...);

functionBeingUsed ();
...; 

答案 4 :(得分:0)

为保持语法,您可以执行以下操作:

#define COUNT_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...)    N
#define COUNT(...)   COUNT_N(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
// Warning: COUNT() return 1 (as COUNT(A)) :-/

#define IDENTITY(N) N
#define APPLY(macro, ...) IDENTITY(macro(__VA_ARGS__))

#define F_1(a) functionBeingUsed(); a;
#define F_2(a, b) functionBeingUsed(a); b;
#define F_3(a, b, c) functionBeingUsed(a, b); c;
#define F_4(a, b, c, d) functionBeingUsed(a, b, c); d;
#define F_5(a, b, c, d, e) functionBeingUsed(a, b, c, d); e;
#define F_6(a, b, c, d, e, f) functionBeingUsed(a, b, c, d, e); f;
#define F_7(a, b, c, d, e, f, g) functionBeingUsed(a, b, c, d, e, f); g;
#define F_8(a, b, c, d, e, f, g, h) functionBeingUsed(a, b, c, d, e, f, g); h;

#define DISPATCH(N) F_ ## N

#define Macro(...) IDENTITY(APPLY(DISPATCH, COUNT(__VA_ARGS__)))(__VA_ARGS__)

Demo

但更容易将语法更改为:

#define Macro(PARAMS, OTHER)  \
    functionBeingUsed PARAMS; \
    OTHER;

Macro((1,2,3,4), int i = 0);