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

中小企业网站制作价格学院网站群建设方案

中小企业网站制作价格,学院网站群建设方案,企业网站建设公司 末路,郑州企业型网站建设折叠表达式(Fold Expressions)是 C17 引入的一种模板元编程技术,用于简化可变参数模板(variadic templates)的参数包展开。它允许以简洁的方式对参数包(parameter pack)中的所有元素进行递归式操…

折叠表达式(Fold Expressions)是 C++17 引入的一种模板元编程技术,用于简化可变参数模板(variadic templates)的参数包展开。它允许以简洁的方式对参数包(parameter pack)中的所有元素进行递归式操作,如求和、逻辑运算、函数调用等。


1. 基本语法

折叠表达式的基本形式如下:

折叠方式语法示例展开形式(假设参数包为 args... = a, b, c
一元右折叠(pack op ...)(a op (b op c))
一元左折叠(... op pack)((a op b) op c)
二元右折叠(pack op ... op init)(a op (b op (c op init)))
二元左折叠(init op ... op pack)(((init op a) op b) op c)

其中:

  • pack 是参数包(如 args...)。
  • op 是操作符(如 +, &&, , 等)。
  • init 是初始值(仅用于二元折叠)。

2. 常见用途

(1) 求和(+ 折叠)

template<typename... Args>
auto sum(Args... args) {return (args + ...); // 一元右折叠:a + b + c
}

展开形式

return (a + (b + c));

(2) 逻辑运算(&&|| 折叠)

template<typename... Args>
bool all_true(Args... args) {return (args && ...); // 检查所有参数是否为 true
}

展开形式

return (a && (b && c));

(3) 逗号操作符折叠(, 折叠)

template<typename... Args>
void print_all(Args... args) {(std::cout << ... << args); // 一元左折叠:(((cout << a) << b) << c)
}

展开形式

((std::cout << a) << b) << c;

3. 为什么使用逗号操作符(,)折叠?

在最初的代码中:

((total_sum += Codec<remove_cvref_t<Args>>::compute_encoded_size(conditional_arg_size_cache, args)), ...);

使用的是逗号操作符折叠,而不是 + 折叠,原因如下:

(1) 保证求值顺序

  • + 折叠的求值顺序是未指定的(unspecified),编译器可以自由优化计算顺序:

    (args + ...); // 可能是 (a + b) + c,也可能是 a + (b + c)
    

    如果 compute_encoded_size 有副作用(如修改 conditional_arg_size_cache),顺序不一致会导致错误。

  • , 折叠的求值顺序是严格从左到右(C++17 起):

    (f(args), ...); // 保证 f(a), f(b), f(c) 按顺序执行
    

    因此,使用 , 折叠可以确保 compute_encoded_size 按参数顺序依次执行。

(2) 避免 + 折叠的潜在问题

如果写成:

total_sum += (Codec<Args>::compute_encoded_size(args) + ...);
  • + 折叠可能先计算所有 compute_encoded_size 再累加,导致 conditional_arg_size_cache 更新顺序错误。
  • , 折叠确保每次计算后立即累加,保证缓存正确更新。

4. 其他折叠表达式示例

(1) 二元左折叠(带初始值)

template<typename... Args>
auto sum_with_init(int init, Args... args) {return (init + ... + args); // 二元左折叠:(((init + a) + b) + c)
}

(2) 调用多个函数

template<typename... Funcs>
void run_all(Funcs... funcs) {(funcs(), ...); // 依次调用 func1(), func2(), func3()
}

(3) 检查是否所有参数满足条件

template<typename... Args>
bool all_even(Args... args) {return ((args % 2 == 0) && ...); // 检查是否全是偶数
}

5. 总结

特性说明
用途简化可变参数模板的参数包展开
求值顺序+* 等数学运算顺序未指定,, 严格从左到右
适用操作符+, -, *, /, &&, `
初始值支持二元折叠((init op ... op pack)(pack op ... op init)
主要优势代码简洁,避免递归模板展开

在最初的代码中,使用 , 折叠是为了确保 compute_encoded_size 按顺序执行,从而正确更新 conditional_arg_size_cache。这是折叠表达式在依赖求值顺序的场景下的典型应用。

http://www.dtcms.com/wzjs/781945.html

相关文章:

  • 虫虫wap建站源码阿里云wordpress数据库
  • 网站如何做外链教程视频二级域名网站可以做关键词优化吗
  • 网站开发支付宝东营做网站多少钱
  • 4免费网站建站海南省建设考试网站首页
  • 一个完整网站开发合肥房产网安居客
  • 包头网站建设 奥北怎么快速推广业务
  • 网络公司网站设计多少钱长沙专业竞价优化首选
  • 免费模板网站推荐怎么查看网站的ftp地址
  • 向国旗敬礼做时代新人网站行业关键词分类
  • 栅格布局 网站设计唐山做网站多少钱
  • 软文推广范文seo优化是什么职位
  • 做网站优化就是发文章吗做百度竞价网站修改影响排名吗
  • 怎样做公司网站介绍广东省企业诚信建设促进会网站
  • 网站地图怎么做一键导航怎么做网站自动采集数据库
  • fireworks8做网站手机客户端网站建设
  • 建网站公司联系方式wordpress 安全检测
  • 幸运快三的网站怎么做公司门户app
  • 屏蔽蜘蛛抓取 对网站有什么影响河南省和城乡建设厅网站首页
  • 服装网站栏目上海建设项目环保验收公示网站
  • 好的建筑设计网站推荐企业展厅设计专业品牌
  • 泉州网站建设技术外包如何申请免费网站空间
  • 三合一网站建设报价爱墙 网站怎么做
  • 南县网站设计科技公司网页图片
  • 手机做网站用什么广州我网站制作
  • 呼市网站制作pc端网页设计公司
  • 网站做适配手机要多久海外网三农频道
  • 建立免费公司网站嘉兴新闻头条最新消息
  • 个人网站开发意义wordpress怎么关闭ssh
  • 自助式建网站关于公司网站建设方案收集
  • 用dw做的代码怎么放在网站上wordpress刷新ssl就没了