サーチ…


備考

Fold式は、次の演算子でサポートされています

+ - * / \ そして、 | << >>
+ = - = * = / = %= \ = &= | = << = >> = =
== != < > <= > = && || 。* - > *

空のシーケンスを折りたたむときは、以下の3つの演算子を除いて、折り畳まれた式が生成されません。

オペレーターパラメータパックが空の場合の値
&& 真実
||
void()

単項折り

単項折り畳みは、特定の演算子を介してパラメータパック折り畳むために使用されます 。単項折り畳みには2種類あります。

  • Unary Left Fold (... op pack)は次のように展開されます。

    ((Pack1 op Pack2) op ...) op PackN
    
  • 単項フォールド(pack op ...)次のように展開されます。

    Pack1 op (... (Pack(N-1) op PackN)) 
    

ここに例があります

template<typename... Ts>
int sum(Ts... args)
{
    return (... + args); //Unary left fold
    //return (args + ...); //Unary right fold

    // The two are equivalent if the operator is associative.
    // For +, ((1+2)+3) (left fold) == (1+(2+3)) (right fold)
    // For -, ((1-2)-3) (left fold) != (1-(2-3)) (right fold)
}

int result = sum(1, 2, 3); //  6

バイナリフォールド

バイナリフォールドは基本的に単項フォールドで、余分な引数があります。

バイナリフォールドには2種類あります。

  • バイナリフォールド- (value op ... op pack) -次のように展開されます。

    (((Value op Pack1) op Pack2) op ...) op PackN
    
  • バイナリフォールド(pack op ... op value) -次のように展開されます。

    Pack1 op (... op (Pack(N-1) op (PackN op Value)))
    

次に例を示します。

template<typename... Ts>
int removeFrom(int num, Ts... args)
{
    return (num - ... - args); //Binary left fold
    // Note that a binary right fold cannot be used
    // due to the lack of associativity of operator-
}

int result = removeFrom(1000, 5, 10, 15); //'result' is 1000 - 5 - 10 - 15 = 970

コンマで折る

パラメータパックの各要素に対して特定の機能を実行する必要があるのは一般的な操作です。 C ++ 11では、できることは次のとおりです。

template <class... Ts>
void print_all(std::ostream& os, Ts const&... args) {
    using expander = int[];
    (void)expander{0,
        (void(os << args), 0)...
    };
}

しかし、表現を倍にすると、上のようにうまく簡略化されます:

template <class... Ts>
void print_all(std::ostream& os, Ts const&... args) {
    (void(os << args), ...);
}

秘密の定型文は必要ありません。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow