1
typedef vector<long,float,short,double,float,long,long double> types;
typedef fold<
      types
    , int_<0>
    , if_< is_float<_2>,next<_1>,_1 >
    >::type number_of_floats;

BOOST_MPL_ASSERT_RELATION( number_of_floats::value, ==, 4 );

フォールドの仕組みがわかりません。なぜ int_<0> なのですか? なぜ is_float< _2 > なのか?

誰かがこの「機能」を理解するための手がかりを教えてもらえますか? ありがとう

4

1 に答える 1

3

int_<0>フォールドに使用されるアキュムレータの開始値です。使用してみてint_<1>、何が起こるかを確認してください。

3 番目の引数は、シーケンスを折りたたむために使用される演算子です。これは、バイナリ メタ関数である必要があります。if_< is_float<_2>,next<_1>,_1 >_1 と _2 は、このラムダ式が取る最初と 2 番目の引数を参照する 2 つの引数を持つラムダ式に変換されます。

is_float<_2>の2 番目の引数が の場合、述語は true をif_返しますfloat_2プレースホルダです。プレースホルダーは、テンプレートの特殊化の n 番目の引数を参照します。

next<_1> は、単に現在の状態の次の値を返します (例: next<int_<0>> == int_<1>)。

述語が false を返す場合、変更されていない状態である _1 を返すだけです。

最初にフォールドとは何かを理解してから、boost::mpl のやり方を理解してください。

簡単な演習は、ベクトルの長さを返す折り畳みを作成することです。

于 2011-04-23T11:05:49.753 に答える