Переменные Аргументы списки с бустом? - PullRequest
8 голосов
/ 19 сентября 2010

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

1 Ответ

7 голосов
/ 19 сентября 2010

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

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

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

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

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

#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"
...