2017-09-23 8 views
0

私は(ラムダ)関数を持っていて、可変引数パックとして渡された多くのファンクタが第3の関数に渡されました。署名は、与えられたgettersの数などの引数としてできるだけ多くを持たなければならない変数テンプレート内のファンクタのパックからパラメータを持つ関数を呼び出す

template<typename F, typename... G> 
ret_t call(F&& func, G&&... getters); 

Fのように見えます。

ここでは、という戻り値を持つ、ハードコーディングされた(constexpr)定数に対して呼び出されるfuncを呼び出す必要があります。したがって、非定型コードは次のようになります

{ 
    return func(getters_1(0), getters_2(0), getters_3(0) /* , ... */); 
} 

もちろん、私はテンプレートメタプログラミングを使用してプロセスを自動化したいと思います。


一時的な配列や中間のコンテナは使用しないでください。 (これはジェネリックを目的としたものではなく、getterの戻り値の型を知っています)最適化を可能にし、メモリを無駄にしないようにできるだけ直接関数に渡したい。

私はラムダのクロージャの多くのレベルでラップすることができた、それぞれ1つのパラメータをラップし、コンパイラから最高のことを願っていますが、とにかく私はそれを行うためのより明確な方法を求めています。

+0

C++ 11、++ 14またはC++ 17のC? – max66

+0

@ max66、私はg ++ 7.2を使っているので、C++ 17です。 – YiFei

+0

@ YiFei定数は常に同じですか? – Rakete1111

答えて

4

は、私はあなたが正しくあなたがこのような何かをしたい理解している場合:

template<typename F, typename... G> 
ret_t call(F&& func, G&&... getters) { 
    return std::forward<F>(func)(std::forward<G>(getters)(0)...); 
} 
+1

これは本当に爽やかです!私はこれを後で試してみることにしました。 – YiFei

関連する問題