可以接受任何个数的参数称为可变参数模板。
4.1 可变参数模板
例如,可以用如下程序实现一个打印输入的参数的函数:
void myPrint() {}
template<typename T, typename... Types>
void myPrint(T firstArg, Types&&... args)
{
std::cout << firstArg << std::endl;
myPrint(std::forward<Types>(args)...);
}
重点是:
- 使用
...
来表明可变参数 - 递归终止条件
可以看到有一个不带参数的myPrint()
其工作原理是生成了多个参数个数不同的 myPrint()
函数,并调用直到没有未使用的参数。
4.2 fold expressions
c++17 语法,略
4.3 可变参数模板应用
可变参数模板在一些通用库中频繁使用,例如 c++ 标准库。举几个例子:
// smart pointer, pass 4.2 and 7.7 to construct a complex
auto sp = std::make_shared<std::complex<float>>(4.2, 7.7);
// thread, call foo(42, "hello") in another thread
std::thread t(foo, 42, "hello");
// insert Customer("Tim", "Jovi", 1962)
std::vector<Customer> v;
v.emplace_back("Tim", "Jovi", 1962);
这些实现都用了“完美转发”(&&
)。
网友评论