我正在尝试进行一种宏“重载”,以便MACRO(something)和MACRO(something,else)的扩展方式不同。
我使用从这里获取的代码片段(我不确定它是否100%可移植)和Boost PP库中的一些函数,成功实现了它。 :D
我使用从这里获取的代码片段(我不确定它是否100%可移植)和Boost PP库中的一些函数,成功实现了它。 :D
//THESE TWO COUNT THE NUMBER OF ARGUMENTS
#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)
//THIS ONE RETURNS THE PARAMETER AT POSITION _i FROM A LIST OF __VA_ARGS__
#define VA_ARG(_i, ...) BOOST_PP_ARRAY_ELEM(_i, (VA_NARGS(__VA_ARGS__), (__VA_ARGS__)))
//AND THIS ONE IS THE 'OVERLOADED' MACRO ;)
#define TEST(...) BOOST_PP_IF(BOOST_PP_EQUAL(1, VA_NARGS(__VA_ARGS__)), function_A(VA_ARG(0, __VA_ARGS__)), \ //1 parameter
BOOST_PP_IF(BOOST_PP_EQUAL(2, VA_NARGS(__VA_ARGS__)), function_B(VA_ARG(0, __VA_ARGS__) + VA_ARG(1, __VA_ARGS__)), \ //2 parameters
BOOST_PP_IF(BOOST_PP_EQUAL(3, VA_NARGS(__VA_ARGS__)), function_C(VA_ARG(1, __VA_ARGS__) + VA_ARG(2, __VA_ARGS__)), BOOST_PP_EMPTY())) // 3 parameters and so on ...
So TEST(a) = function_A(a)
TEST(a, b) = function_B(a + b)
TEST(a, b, c) = function_C(b + c)
现在我还有两件事情想做:
(如果我永远不解决这个问题,我真的不在意)我相信可以编写一个宏,当它接收到“变量”的数量及其对应的“输出”时,生成类似上面示例的代码。例如,TEMPLATE(3, function_A(...), function_B(...), function_C(...))生成如上所示的代码。
当没有参数调用TEST()会发生什么?好吧,VA_NARGS会扩展为1。但第一个参数是""(空白)。我正在尝试找到一种方法,要么检测__VA_ARGS__中的'零'参数,要么区分'空'参数和实际参数,以便将'重载'函数扩展到响应此情况。有任何想法吗?
__VA_ARG__
тњї__VA_ARG__,
№╝ѕ2008 express№╝Ѕсђѓ - KitsuneYMG