Передача произвольного числа аргументов в функцию
В общем, я хотел бы переопределить эту часть кода с помощью макросов,
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.
Спасибо.
1 ответ
что-то вроде variadic_(8, массив), расширяется до variadic(массив [0], массив [1], массив [2], массив [3], массив [4], массив [5], массив [6], массив [7], массив [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
просто карты обратно в ()
,