Если вам нужно только принять переменное число аргументов одного и того же типа, обычным делом будет взятие контейнера.Тем не менее, создание контейнера может быть упрощено с помощью 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"