alm*_*now 4 macros c-preprocessor variadic-macros boost-preprocessor
我正在尝试做某种宏"重载",以便MACRO(某些东西)的扩展方式与MACRO(其他东西)不同.
使用我从这里得到的片段(我不确定它是否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)
Run Code Online (Sandbox Code Playgroud)
现在我还想念我想要做的其他两件事:
(这个我真的不在乎,如果我从来没有解决过它)我相信可以写出一个MACRO,当占用'变体'的数量时,其对应的'输出'产生类似于上面的代码.像TEMPLATE(3,function_A(...),function_B(...),function_C(...))之类的东西来生成上面的例子.
在没有参数的情况下调用TEST()会发生什么?好吧,VA_NARGS扩展为1.但第一个参数是""(没有).我试图找到一种方法来检测"零"参数__VA_ARGS__或区分"空"参数和真实参数,以扩展"重载"函数以对这种情况作出反应.有任何想法吗?
| 归档时间: |
|
| 查看次数: |
5726 次 |
| 最近记录: |