Ответ 1
Прямо писать функцию с вариационными шаблонами, которые принимают произвольное количество аргументов. Единственное отличие от общего шаблона состоит в том, что конкретный тип используется в качестве первого аргумента (head) - вместо параметра шаблона. В следующем примере показана функция foobar
, которая принимает произвольное количество строк.
// used for end of recursion - and for the empty arguments list
void foobar() { }
template <typename ...Tail>
void foobar(const std::string& head, Tail&&... tail)
{
// do something with head
std::cout << head << '\n';
// call foobar recursively with remaining arguments
foobar(std::forward<Tail>(tail)...);
}
foobar("Hello", "World", "...");
Лично я предпочитаю использовать std::initializer_list
вместо вариативных шаблонов. Поскольку вариативные шаблоны более сложны и требуют дополнительного опыта. С помощью std::initializer_list
он может выглядеть так:
void foobar(std::initializer_list<std::string> values)
{
for (auto& value : values) {
// do something with value
std::cout << value << '\n';
}
}
foobar({ "Hello", "World", "...", });
К сожалению, дополнительные фигурные скобки требуются при использовании std::initializer_list
с регулярными функциями. Они не требуются для конструкторов, если используется новый синтаксис инициализатора.
Изменить: Переписал ответ в соответствии с отзывами. В частности, я изменил порядок двух решений/примеров.