Fold Expression : C++
About
C++17から追加
Types
Unary Right Folds (単項右畳み込み)
形式:$ pack \> \cdot \ldots
右から畳み込まれる:$ (A_0 \> \cdot (A_1 \> \cdot (\ldots A_n)))
e,g., Parameter PackがSeparatorであるか判断する
code:cpp
// Parameter Packはtemplate<char ... Separators>として与えられるものとする
// c: charがParameter Packのいずれかと等しければtrueを返す
auto is_separator = &(char c) -> bool {
return ((c == Separators) || ...);
};
Unary Left Folds (単項左畳み込み)
形式:$ \ldots \> \cdot pack
左から畳み込まれる:$ ((A_0 \> \cdot A_1) \> \cdot \ldots A_n)
e.g., Parameter Packがすべて0であるか判断する
code:cpp
// すべてのv in Valuesが0であることを要請する
template<int ... Values>
bool is_all_zero(void)
{
return (... && (Values == 0));
}
// eval: is_all_zero<0, 0, 0> == true
// eval: is_all_zero<0, 1, 2> == false
Binary Right Folds (二項右畳み込み)
形式:$ pack \> \cdot \ldots \cdot \> init
右から畳み込まれる:$ (A_0 \> \cdot (A_1 \> \cdot (\ldots A_n \> \cdot init)))
Binary Left Folds (二項左畳み込み)
形式:$ init \> \cdot \ldots \cdot \> pack
左から畳み込まれる:$ (((init \> \cdot A_0) \> \cdot A_1) \> \cdot \ldots A_n)
備考
Comma Operatorも使用できる
したがって,Parameter Packの内容を〈捨てる〉ようなことができる