たとえば、呼び出し可能な関数(関数、関数ポインタ、オブジェクトインスタンスoperator()
、lambda、mem_fn
など)をタイプイレーズできることが望ましい場合がありますUsing Boost adaptors with C++11 lambdasにあります。ここでは、コピーアサイン可能なデフォルトのコンストラクタブルタイプが必要です。"make_function"のラムダまたは任意の呼び出し可能コードの呼び出しの推測
std::function
は理想的ではなく、自動的にへの道でクラステンプレートstd::function
をインスタンス化するために、どのような署名を決定することがないように思われます。任意の呼び出し可能関数の関数シグネチャを取得し、適切なstd::function
インスタンス化インスタンス(つまり、make_function
関数テンプレート)に簡単な方法でラップできますか?
具体的には、私は
template<typename F> using get_signature = ...;
template<typename F> std::function<get_signature<F>> make_function(F &&f) { ... }
make_function([](int i) { return 0; })
がstd::function<int(int)>
を返すように、どちらか一方を探しています。インスタンスが2つ以上のシグネチャ(例えば、2つ以上のテンプレート、またはデフォルトパラメータoperator()
を持つオブジェクトなど)を使用して呼び出し可能な場合、これが動作することは明らかです。
過度に複雑でない非ブースト溶液が好ましいが、ブーストは良好である。
編集:自分の質問に答える。
を。それに対して、私は、イントロスペクション・ファンクタはC++ 11の反パターンのものであると考えています。 'std :: function'が本当に必要であることを確認してください。 –