C++模板元编程---折叠表达式

基础博客:https://blog.csdn.net/qq_35976351/article/details/106985750

折叠表达式同样是运行在编译期间的,先给出基本的规则:

注意,一元表达式只有&&||或者,有缺省值,三者空包的默认值分别是:truefalsevoid()

所有支持的运算符是:

+ - * / % ^ & | = < > << >> += -= *= /= %= ^= &= |= <<= >>= == != <= >= && || , .* ->*

给出一元折叠代码示例:

#include <iostream>

template <typename... Args>
auto SubOpRight(Args&&... args) {
    return (args - ...);
}

template <typename... Args>
auto SubOpLeft(Args&&... args) {
    return (... - args);
}

int main() {
    // ([-1] - [-2]) - [-3]   4
    auto lv = SubOpLeft(-1, -2, -3);
    // [-1] - ([-2] - [-3])   -2
    auto rv = SubOpRight(-1, -2, -3);
    std::cout << lv << ", " << rv << std::endl;
    return 0;
}

二元表达式,相当于有了初始值,代码示例:

#include <iostream>

template <typename... Args>
auto SubOp2Right(Args&&... args) {
    return (args - ... - 1);
}

template <typename... Args>
auto SubOp2Left(Args&&... args) {
    return (1 - ... - args);
}

int main() {
    // ((1 - [-1]) - [-2])) - [-3]    7
    auto lv = SubOp2Left(-1, -2, -3);
    // [-1] - (([-2] - ([-3] - 1)))    -3
    auto rv = SubOp2Right(-1, -2, -3);
    std::cout << lv << ", " << rv << std::endl;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值