将任意数量的参数传递给函数

Passing an arbitrary number of args to a function

所以基本上,我想使用宏重新定义这部分代码,

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]);
...
}

我的约束是可变参数是一个不能传递计数的函数,所以我不能通过引用传递数组。这种方式工作得很好,但我想知道我是否可以使用宏或以更好的方式来做到这一点,我不介意参数的数量是否有限,因为现在,我只处理 6 个。

谢谢。

something like variadic_(8, array), expanding to variadic(array[0], array[1], array[2], array[3], array[4], array[5], array[6], array[7], array[8]);

使用升压预处理器,你可以简单地这样做:

#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 只是映射回 ()