情境
先問個問題,如果今天要寫 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),這是一種處理可變參數模板的簡單而強大的方式。折疊表達式允許你以一種簡潔的方式將可變參數包展開並應用到二元運算符上。
折疊表達式有四種基本形式:
- 一元左折疊: (… op pack)
- 一元右折疊: (pack op …)
- 二元左折疊: (init op … op pack)
- 二元右折疊: (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;
}
區域變數視窗
區域變數視窗
執行結果
比如求和、求積、求最大值和最小值等。
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...});
}
以上,這是個好用的語法,試著用用看吧!




