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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章