1

次のように呼び出す関数を書きたいと思います。

f("a", 1,                 [](float a                  ) { … });
f("a", 1, "b", 2,         [](float a, float b         ) { … });
f("a", 1, "b", 2, "c", 3, [](float a, float b, float c) { … });

関数が何をするかは重要ではありません。ポイントは、char*/integer パラメーターの各ペアがf、ラムダ関数の float パラメーターに対応することです。私はこれまでに得ます:

template <typename ...Args>
void f(Args... args, std::function<void(???)> cb);

パラメーターのカーディナリティが入力ペアのカーディナリティと一致するように、ファンクター型を宣言するにはどうすればよいですか?

4

1 に答える 1

2

関数オブジェクトの引数が必要な場合は、通常、関数が任意の型を受け入れるようにし、型が実際に一致しない場合にコンパイラが自動的にエラーを出力するようにする必要があります。

template <typename... Args, typename F>
void f(const F& func, Args&&... args) { ... }

(可変部分はすべての引数を消費するため、関数の引数を前に移動したことに注意してください。)

于 2012-08-12T08:49:16.367 に答える