将任意数量的参数传递给函数
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
只是映射回 ()
。
所以基本上,我想使用宏重新定义这部分代码,
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
只是映射回 ()
。