Списки переменных аргументов с повышением?


Я хотел написать функцию со списком переменных аргументов. Я хочу изучить свои возможности. Я почти уверен, что я пришел через класс шаблона boost, который был разработан для этой цели, но я не могу вспомнить его название? Кто-нибудь может мне сказать? или мне все это приснилось? Спасибо

1 8

1 ответ:

Если вам нужно только принять переменное количество аргументов одного и того же типа, то взять контейнер было бы обычным делом. Создание контейнера, однако, может быть облегчено с помощью Boost.Назначить :

void f(const std::vector<int>& vec) {}
f(boost::assign::list_of(1)(2)(3)(4));

В качестве альтернативы вы можете перейти к перегрузке операторов (например, operator() или operator<<) самостоятельно, аналогично подходу, используемому стандартными библиотечными потоками:

op() << arg1 << arg2 << arg3;

Если вы действительно хотите, чтобы обеспечить тип-безопасная функция с переменным числом аргументов (без использования C++0х особенности), повышение.Препроцессор может помочь. Общий пример:

#define OUT(z, n, name) << name ## n

#define MAKE_FUNC(z, n, unused)                                     \
    template<class T BOOST_PP_ENUM_TRAILING_PARAMS(n, class T)>     \
    void func(T t BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(n, T, t) ) { \
        std::cout << t BOOST_PP_REPEAT(n, OUT, t) << std::endl;     \
    }

BOOST_PP_REPEAT(9, MAKE_FUNC, ~) // generates func() versions taking 1-10 arguments
func(1, "ab", 'c'); // prints "1abc"