Передача произвольного числа аргументов в функцию

В общем, я хотел бы переопределить эту часть кода с помощью макросов,

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 просто карты обратно в (),

Другие вопросы по тегам