使用可变参数模板编写一个函数很简单,它接受任意数量的参数。与一般模式的唯一区别是,具体类型用作第一个参数(头) - 而不是模板参数。下面的示例显示了一个函数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
不幸的是,与常规函数一起使用时需要额外的花括号。如果使用了新的初始化语法,则构造函数不需要它们。
编辑:根据反馈重写答案。特别是我改变了两个解决方案/示例的顺序。