基本上,我想使用宏重新定义这部分代码,
switch(count) {
case 0:
variadic();
case 1:
variadic(array[0]);
case 2;
variadic(array[0], array[1]);
case 3:
variadic(array[0], array[1], array[2]);
...
}
我的约束是variadic是一个不能传递计数的函数,所以我不能通过引用传递数组。这种方式运行得很好,但我想知道我是否可以使用宏来做到这一点,或者以更好的方式,我不介意参数的数量是否有限,因为现在,我只能处理6个。 / p>
谢谢。
答案 0 :(得分:0)
类似variadic_(8,array),扩展为variadic(array [0],array [1],array [2],array [3],array [4],array [5],array [6] ,array [7],array [8]);
使用boost预处理器,您只需执行此操作:
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/tuple/pop_front.hpp>
#define TO_ARRAY(_,N,V) ,V[N]
#define variadic_(C,A) \
variadic BOOST_PP_TUPLE_POP_FRONT((BOOST_PP_REPEAT(C,TO_ARRAY,A)));
(删除BOOST_PP_
进行讨论)
REPEAT(3,TO_ARRAY,array)
生成一个计数列表,扩展为:
TO_ARRAY(
#,0,array) TO_ARRAY(
#,1,array) TO_ARRAY(
#,2,array)
...每个#
都是一些你应该忽略的数字(与嵌套宏有关,但你真的不关心它)。
使用定义的TO_ARRAY
,这会扩展为,array[0],array[1],array[2]
;用括号括起来的是一个元组。这有一个额外的引号,TUPLE_POP_FRONT
剥离。
作为一个极端情况,如果您传入0
,则会构建元组()
,TUPLE_POP_FRONT
只会映射回()
。