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

怎么在网站上做按钮xampp本地搭建网站

怎么在网站上做按钮,xampp本地搭建网站,十大成功营销策划案例,温州网站升级折叠表达式(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/585034.html

相关文章:

  • 湖北系统建站怎么用多语言网站多域名推广
  • 网站建设选择wordpress筛选
  • 官方网站下载手电筒百度关键词优化的方法
  • 亿唐网不做网站做品牌案例分析久久网招聘信息
  • 我想网站建设百度的网址
  • 关于实验室建设的英文网站公司名称打分
  • 哪里有营销型网站最新报价php 手机网站
  • 网站建设与管理学的是什么自学做蛋糕的网站
  • 南宁做网站找哪家惠州市网站建设
  • 公司英文网站建设wordpress访问404
  • 自己能建网站吗托管竞价账户哪家好
  • 设计得好的网站推荐开源免费的网站程序
  • 昆明做网站的公司有哪些天眼查官网查询企业
  • 怎样做网站平台怎么做直播网站刷弹幕
  • 合肥公司网站建设多少费用网站建设项目可行性分析
  • 自建服务器网站备案创意视频制作app
  • wordpress新手建站电商网站规划设计方案
  • 搜索公司信息的网站千库网官网首页登录
  • 国外能下载模板的网站深圳互联网科技有限公司
  • 长沙企业网站制作哪家好陕西做网站找谁
  • 手机触屏版网站域名到期对网站影响
  • 合肥制作网站的公司长沙app制作
  • 森东网站建设龙岗区是深圳最差的区
  • 电子商务网站建设题6长沙专业公司网站建设源头
  • 楚雄 公司 网站溧水114网站开发
  • 低价自适应网站建设优化建站室内设计效果图qq群
  • 怎么利用招聘网站做薪酬调查营销企业网站制作
  • 广州手机网站开发鄂州做网站报价
  • 南昌网站建设哪家比较好青岛网站建设哪家权威
  • 做网站图片的大小青海城乡建设网站