Home Item 16 - 折疊表達式(fold expressions) (中文)
Post
Cancel

Item 16 - 折疊表達式(fold expressions) (中文)

情境

先問個問題,如果今天要寫 function 處理 sum(1,2) ,或是 sum(1.0,2.0),我們可以寫以下 code 處理。

1
2
3
4
5
6
7
8
9
auto sum(int a, int b)
{
    return a+b;
}

auto sum(double a, double b)
{
    return a+b;
}

但是,這樣太麻煩了,懂得人會知道要寫 template 處理上述情境

1
2
3
4
5
6
7
8
template<typename T1, typename T2>
auto sum(T1 a, T2 b) {
    return a + b;
}

sum(3, 4)
sum(2.5, 3.5)
sum(5, 2.5)

OK, 接下來我們繼續把情境擴大,現在想要 function 可以做到 sum(a,b,c)、 sum(a,b,c,d)、甚至 sum(a,b,c,d,e) …etc

我們知道上述的 template function 只能處理兩個可被加的參數。 難道,我們要再寫以下的 code

1
2
3
4
5
6
template<typename T1, typename T2, typename T3>

template<typename T1, typename T2, typename T3, typename T4>

...

c++17 折疊表達式(fold expressions)解決以上問題

折疊表達式(fold expressions)

C++17 引入了折疊表達式(fold expressions),這是一種處理可變參數模板的簡單而強大的方式。折疊表達式允許你以一種簡潔的方式將可變參數包展開並應用到二元運算符上。

折疊表達式有四種基本形式:

  1. 一元左折疊: (… op pack)
  2. 一元右折疊: (pack op …)
  3. 二元左折疊: (init op … op pack)
  4. 二元右折疊: (pack op … op init)

以下示範 一元左折疊處理上面 sum function 的問題

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>

template<typename... Args>
auto sum(Args... args) {
    return (... + args);
}

int main() {
    std::cout << "Sum: " << sum(1, 2, 3) << std::endl;
    std::cout << "Sum: " << sum(1, 2.2, 3.3, 4, 5) << std::endl;
    return 0;
}

Desktop View

區域變數視窗

Desktop View

區域變數視窗

Desktop View

執行結果

Desktop View

比如求和、求積、求最大值和最小值等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <algorithm>


template<typename... Args>
auto sum(Args... args) {
    return (... + args);
}

template<typename... Args>
auto product(Args... args) {
    return (args * ...);
}

template<typename... Args>
auto max_value(Args... args) {
    return std::max({args...});
}

template<typename... Args>
auto min_value(Args... args) {
    return std::min({args...});
}

以上,這是個好用的語法,試著用用看吧!

☝ツ☝

This post is licensed under CC BY 4.0 by the author.

👈 ツ 👍