Z
ZHANK
编程在线教程C++ 教程变参模板与折叠表达式
模板深入

变参模板与折叠表达式

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)...);
}