I already know the stdarg.h way to have a function with variable arguments in c++ as discussed here for example.
I also know c++11 standard has variadic templat
It is straight forward to write a function with variadic templates, that accept an arbitrary number of arguments. The only difference to the general pattern is, that a concrete type is used as first argument (head) - instead of a template parameter. The following example shows a function foobar, that accepts an arbitrary number of strings.
// used for end of recursion - and for the empty arguments list
void foobar() { }
template
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)...);
}
foobar("Hello", "World", "...");
Personally, I prefer using std::initializer_list instead of variadic templates. Because variadic templates are more complex and require additional experience. With std::initializer_list, it might look like this:
void foobar(std::initializer_list values)
{
for (auto& value : values) {
// do something with value
std::cout << value << '\n';
}
}
foobar({ "Hello", "World", "...", });
Unfortunately, the additional curly braces are required when using std::initializer_list with regular functions. They are not required for constructors, if the new initializer syntax is used.
Edit: Rewrote the answer according to the feedback. In particular I have changed the order of the two solutions/examples.