3

引数ごとに、2 つのネストされた関数を適用する必要があります。

obj.apply(someFilter(arg)); // arg is one argument, but here
                            // should be an unpacking of args

そのような場合のアンパックの書き方がわかりません。

これを見た:

 pass{([&]{ std::cout << args << std::endl; }(), 1)...};

wikiにありますが、これを私の場合に適用する方法がわかりません。

4

3 に答える 3

4

それは実際には非常に簡単です: 可変個引数テンプレートの引数パックの unpack 内に任意の式を入れることができます:

obj.apply(someFilter(arg))...

obj.applyこれにより、コンマ区切りのリストとしての結果が得られます。その後、ダミー関数に渡すことができます。

template<typename... Args> swallow (Args&&...) {}
swallow(obj.apply(someFilter(arg))...);

コンマ区切りのリストを飲み込む。

もちろん、これはobj.apply何らかのオブジェクトを返すことを前提としています。そうでない場合は、使用できます

swallow((obj.apply(someFilter(arg)), 0)...);

実際の (非void) 引数を作成する

obj.apply` が何を返すかわからない場合 (結果がコンマ演算子をオーバーロードしている可能性があります)、次を使用してカスタム コンマ演算子の使用を無効にすることができます。

swallow((obj.apply(someFilter(arg)), void(),  0)...);

実際に項目を順番に評価する必要がある場合 (これは質問からはあまりありそうにないようです)、関数呼び出しを使用する代わりに、配列の初期化構文を悪用できます。

using Alias=char[];
Alias{ (apply(someFilter(args)), void(), '\0')... };
于 2013-03-07T16:53:53.890 に答える
1

これは、パラメーター パックに対して任意の一連のアクションを実行する堅牢な方法です。これは最小の驚きの原則に従い、次の順序で操作を行います。

template<typename Lambda, typename Lambdas>
void do_in_order( Lambda&& lambda, Lambdas&& lambdas )
{
  std::forward<Lambda>(lambda)();
  do_in_order( std::forward<Lambdas>(lambdas)... );
}

void do_in_order() {}

template<typename Args>
void test( Args&& args ) {
  do_in_order( [&](){obj.apply(someFilter(std::forward<Args>(args)));}... );
}

基本的に、ラムダの山を に送信し、do_in_order前後に評価します。

于 2013-03-07T17:08:36.633 に答える
0

コードにはargパラメーター パックとして複数の s があると思いますか? 試す:

obj.apply( someFilter( arg )... );

パラメータのアンパックが式に適用されるため、パラメータ パックの各要素は に展開されsomeFilter( arg )ます。

于 2013-03-07T16:53:36.930 に答える