变参模板与折叠表达式
typename... Args 参数包、sizeof... 编译期计数、C++17 折叠表达式
变参模板与折叠表达式
C++11 的变参模板(Variadic Templates)+ C++17 的折叠表达式——让模板接受任意数量参数。
学完本章你将: 掌握 typename... Args、sizeof...、折叠表达式。
变参模板基础
cpp
// 递归解包
template <typename T>
T sum(T t) { return t; }
template <typename T, typename... Args>
T sum(T first, Args... rest) {
return first + sum(rest...);
}
std::cout << sum(1, 2, 3, 4, 5); // 15
C++17 折叠表达式(简洁!)
cpp
// 求和——一行搞定
template <typename... Args>
auto sum(Args... args) {
return (... + args); // 一元右折叠:arg1 + (arg2 + (arg3 + ...))
}
// 其他运算符
template <typename... Args>
auto product(Args... args) { return (... * args); }
template <typename... Args>
bool allTrue(Args... args) { return (... && args); }
变参应用
cpp
// 变参构造函数——转发所有参数
template <typename T>
class Wrapper {
T value;
public:
template <typename... Args>
Wrapper(Args&&... args) : value(std::forward<Args>(args)...) { }
};
// push_back 变参版
template <typename... Args>
void emplace(Args&&... args) {
new (ptr) T(std::forward<Args>(args)...);
}