首页 > 后端开发 > C++ > 正文

C++模板参数包扩展 折叠表达式应用

P粉602998670
发布: 2025-08-30 12:09:01
原创
440人浏览过
C++模板参数包扩展与折叠表达式支持可变参数的编译时处理,用于函数转发、编译计算、代码生成和类型推导,相比std::initializer_list更灵活高效,适用于异构类型和零运行时开销场景。

c++模板参数包扩展 折叠表达式应用

C++模板参数包扩展与折叠表达式,本质上是为了更灵活、更简洁地处理数量不定的模板参数。它们是现代C++元编程的基石,允许我们编写泛型代码,而无需预先知道参数的数量和类型。

参数包扩展与折叠表达式是C++11和C++17引入的特性,允许函数和类模板接受可变数量的参数。

解决方案

C++模板参数包扩展与折叠表达式主要应用于以下几个方面:

立即学习C++免费学习笔记(深入)”;

  1. 函数参数转发: 完美转发任意数量的参数到另一个函数。
  2. 编译时计算: 在编译时对参数包中的元素进行计算,例如求和、求最大值等。
  3. 代码生成: 根据参数包中的元素生成重复的代码片段,例如初始化列表、打印语句等。
  4. 类型推导: 根据参数包中的元素推导出复杂的类型,例如元组、变长数组等。

下面分别给出示例:

函数参数转发:

template<typename F, typename... Args>
auto call_with_args(F&& f, Args&&... args) {
    return f(std::forward<Args>(args)...);
}

void print_args(int a, double b, std::string c) {
    std::cout << "a: " << a << ", b: " << b << ", c: " << c << std::endl;
}

int main() {
    call_with_args(print_args, 10, 3.14, "hello"); // 输出: a: 10, b: 3.14, c: hello
    return 0;
}
登录后复制

编译时计算 (折叠表达式):

template<typename... Args>
auto sum(Args... args) {
    return (args + ...); // 右折叠,等价于 (arg1 + (arg2 + (arg3 + ...)))
}

int main() {
    std::cout << sum(1, 2, 3, 4, 5) << std::endl; // 输出: 15
    return 0;
}
登录后复制

代码生成 (结合初始化列表):

#include <iostream>
#include <vector>

template<typename T, typename... Args>
std::vector<T> make_vector(Args&&... args) {
    return {std::forward<Args>(args)...};
}

int main() {
    std::vector<int> v = make_vector<int>(1, 2, 3, 4, 5);
    for (int x : v) {
        std::cout << x << " ";
    }
    std::cout << std::endl; // 输出: 1 2 3 4 5
    return 0;
}
登录后复制

类型推导 (元组):

AiPPT模板广场
AiPPT模板广场

AiPPT模板广场-PPT模板-word文档模板-excel表格模板

AiPPT模板广场 147
查看详情 AiPPT模板广场

虽然参数包本身不直接进行类型推导,但可以结合

std::tuple
登录后复制
等类型来间接实现:

#include <iostream>
#include <tuple>

template<typename... Args>
auto make_tuple(Args&&... args) {
    return std::make_tuple(std::forward<Args>(args)...);
}

int main() {
    auto my_tuple = make_tuple(10, 3.14, "world");
    std::cout << std::get<0>(my_tuple) << std::endl; // 输出: 10
    std::cout << std::get<1>(my_tuple) << std::endl; // 输出: 3.14
    std::cout << std::get<2>(my_tuple) << std::endl; // 输出: world
    return 0;
}
登录后复制

如何理解C++模板参数包扩展的原理?

参数包扩展的核心在于将一个参数包“展开”成一个逗号分隔的列表。这个列表可以出现在函数参数列表、初始化列表、基类列表等多种上下文中。展开的过程是由编译器完成的,它会根据参数包中的元素数量和类型,生成相应的代码。

理解的关键点在于

...
登录后复制
运算符:

  • 在模板参数列表中,
    typename... Args
    登录后复制
    表示声明一个名为
    Args
    登录后复制
    的参数包。
  • 在函数参数列表中,
    Args&&... args
    登录后复制
    表示声明一个名为
    Args
    登录后复制
    的函数参数包,其中每个参数都是一个右值引用。
  • 在表达式中,
    f(args...)
    登录后复制
    f(std::forward<Args>(args)...)
    登录后复制
    表示将参数包
    Args
    登录后复制
    展开,并将展开后的参数列表传递给函数
    f
    登录后复制

折叠表达式有哪些不同的形式?

C++17引入了折叠表达式,它提供了一种更简洁的方式来处理参数包。折叠表达式有四种形式:

  • 右折叠 (unary right fold):
    (pack op ...)
    登录后复制
    等价于
    (e1 op (e2 op (e3 op ... en)))
    登录后复制
  • 左折叠 (unary left fold):
    (... op pack)
    登录后复制
    等价于
    (((e1 op e2) op e3) op ... en)
    登录后复制
  • 带初始值的右折叠 (binary right fold):
    (pack op ... op init)
    登录后复制
    等价于
    (e1 op (e2 op (e3 op ... (en op init))))
    登录后复制
  • 带初始值的左折叠 (binary left fold):
    (init op ... op pack)
    登录后复制
    等价于
    (((((init op e1) op e2) op e3) op ... en)
    登录后复制

其中,

pack
登录后复制
是参数包,
op
登录后复制
是运算符,
init
登录后复制
是初始值。 运算符可以是
+
登录后复制
,
-
登录后复制
,
*
登录后复制
,
/
登录后复制
,
&&
登录后复制
,
||
登录后复制
,
,
登录后复制
等等。

例如,求参数包中所有元素的乘积:

template<typename... Args>
auto product(Args... args) {
    return (args * ... * 1); // 带初始值的右折叠,初始值为1
}

int main() {
    std::cout << product(1, 2, 3, 4, 5) << std::endl; // 输出: 120
    return 0;
}
登录后复制

参数包扩展与
std::initializer_list
登录后复制
有什么区别

虽然

std::initializer_list
登录后复制
也可以用来处理数量不定的参数,但它与参数包扩展有本质的区别:

  • std::initializer_list
    登录后复制
    要求所有参数的类型相同,而参数包扩展允许参数具有不同的类型。
  • std::initializer_list
    登录后复制
    在运行时构造一个数组,并将参数复制到该数组中,而参数包扩展在编译时展开,没有运行时的开销。
  • std::initializer_list
    登录后复制
    只能用于初始化列表,而参数包扩展可以用于更广泛的场景,例如函数参数转发、编译时计算、代码生成等。

因此,参数包扩展比

std::initializer_list
登录后复制
更加灵活和强大,是现代C++中处理可变参数的首选方式。
std::initializer_list
登录后复制
主要用于构造函数初始化列表等特定场景。

以上就是C++模板参数包扩展 折叠表达式应用的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号