当前位置: 首页 > news >正文

可变参数模版中的折叠表达式

C++17 后,有一个特性可以对参数包的所有参数使用二元运算符计算结果(初始值可选)。

例如,下面的函数会返回所有入参的和:

template<typename... T>
auto foldSum (T... s)
{return (... + s); // ((s1 + s2) + s3) ...
}

若参数包为空,表达式通常是错误格式的(除了操作符&& 的值为true,操作符|| 的值为false,逗号操作符空参数包的值为void())。

下表列出了可能的折叠表达式。

折叠表达式 展开
( ... op pack ) ((( pack1 op pack2 ) op pack3 ) ... op packN )
( pack op ... ) ( pack1 op ( ... ( packN-1 op packN )))
( init op ... op pack ) ((( init op pack1 ) op pack2 ) ... op packN )
( pack op ... op init ) ( pack1 op ( ... ( packN op init )))

几乎所有的二元运算符都可以使用折叠表达式。例如,可以使用折叠表达式来遍历一个二叉树的路径,使用操作符->*:

foldtraverse.cpp

// define binary tree structure and traverse helpers:
struct Node
{int value;Node* left;Node* right;Node(int i=0) : value(i), left(nullptr), right(nullptr){}...
};auto left = &Node::left;auto right = &Node::right;// traverse tree, using fold expression:template<typename T, typename... TP>Node* traverse (T np, TP... paths){return (np ->* ... ->* paths); // np ->* paths1 ->* paths2 ...}int main(){// init binary tree structure:Node* root = new Node{0};root->left = new Node{1};root->left->right = new Node{2};...// traverse binary tree:Node* node = traverse(root, left, right);...}

这里,

(np ->* ... ->* paths)

使用折叠表达式遍历从 np 开始的可变元素路径。

这种使用初始化器的折叠表达式,可以简化可变参数模板来打印上面的所有参数:

template<typename... Types>
void print (Types const&... args)
{(std::cout << ... << args) << '\n';
}

但无法为参数包中的每个元素输出添加打印空格。要添加空格,需要一个额外的类模板,确保参数的输出都会添加一个空格:

addspace.hpp

template<typename T>
class AddSpace
{
private:T const& ref; // refer to argument passed in constructor
public:AddSpace(T const& r): ref(r){}friend std::ostream& operator<< (std::ostream& os, AddSpace<T> s){return os << s.ref << ' '; // output passed argument and a space}};template<typename... Args>void print (Args... args){( std::cout << ... << AddSpace(args) ) << '\n';}

表达式AddSpace(args) 使用类模板参数推断产生AddSpace(args),这为每个参数创建一个AddSpace 对象,该对象引用传递的参数,并在输出表达式时使用该参数添加一个空格。

http://www.gsyq.cn/news/76150.html

相关文章:

  • scikit-learn 能否做深度学习?——兼谈不同神经元数量的模型对比实验实现
  • 深入解析USB侦探:数字取证数据流分析技术
  • 深入解析:Spring Boot 3.2 高性能架构实战:虚拟线程、原生镜像与响应式编程全解析
  • CMake-模块化
  • HELLDIVERS 2 地狱潜兵 2 缩小体积至22.54G 教程
  • Milvus GUI ATTU Docker 容器化部署指南
  • 人工神经元输入机制深度解析:从理论基础到工程实践的全面指南
  • 安卓页面的布局和生命周期(新手村第三篇) - 详解
  • 本地AI模型API网址添加到Open WebUI的方法
  • P14660 你不孤单,我们都在 题解
  • [开源项目] 蜜蜂记账 v2.2 发布:暗黑模式、标签系统、预算管理等 10+ 新功能
  • 【09】Word文档处理工具
  • 谁在主导“芯片战争”
  • 2025深圳CNC加工实力榜:金丰业五金塑胶以精密智造领跑,六家本土技术标杆企业核心优势深度解析
  • 岐金兰意义行为原生理论与AI元人文价值操作系统研究
  • 2025东莞包装材料厂家实力榜:共晟包装以可降解防静电技术领跑,八大环保纸袋品类深度解析
  • chat2db邀请码
  • 2025 最新高端艺术漆品牌 TOP10推荐!技术创新 + 美学表达权威榜单发布,重新定义墙面装饰新高度,行业专业数据,行业口碑榜及选择指南
  • 《密码系统设计》第十一周预习报告
  • 2025康明斯发电机组实力榜:广东三澳新能源科技领衔,六家高潜力本土品牌深度解析
  • 2025东莞汉高实业除蜡水厂家实力榜:六家国产技术代表企业的不锈钢金属工业清洗核心优势深度解析
  • 2025广东山农农业集团蔬菜配送实力榜:六家本土生鲜巨头的新鲜食材与有机食堂供应深度解析
  • will Arab play English again?
  • AI Studio GPU 占用过高导致卡顿的解决办法
  • 详细介绍:【Jenkins】Jenkins配置从节点 - Launch Agent
  • 中旅国际数据库国产化升级:以金仓KES打造安全可控的旅游服务底座 - 实践
  • 2025 最新墙面艺术涂装服务商 / 厂家 TOP5 评测!技术创新 + 美学赋能权威榜单发布,重新定义空间装饰新体验,肌理壁膜 艺术漆 墙面艺术涂装 高端艺术漆
  • 深入解析:回溯剪枝的“减法艺术”:化解超时危机的 “救命稻草”(三)
  • python题库 No.28 shopping
  • 博客4