0

(とりわけ)関数のようなオブジェクトを引数として指定された戻り型を持つ(テンプレート化された)関数を提供したいと思います。理想的には、明示的なテンプレート引数なしでその関数を呼び出せるようにしたいと思います。

これまでに試しました:

template<A, B, F>
B some(A a, F f) { return f(a); }

template<A, B>
B some(A a, B (*f)(A)) { return some<A, B, B (*)(A)>(a, f); }

テンプレート引数を完全に推測できるようにするためのオーバーロードがある場合、少なくとも関数ポインターについては。にはメンバーstd::unary_functionが含まれておらず、としては適していないため、テンプレートを特殊化できないようです。operator()F

さらに、FにFを持たせたいことをコンパイラーに通知できないため、一般的にファンクターの解決策はないようですB operator()(A)。それとも、そのようなダックタイピングはどういうわけか可能ですか?

4

1 に答える 1

0

std::unary_functionを提供する必要がある他のクラスの単なるベースですoperator()。のインスタンスはまったくないはずなunary_functionので、問題はわかりません。3つのテンプレート引数をとる最初の関数は、このような問題の公式な解決策です。

編集:明示的なテンプレート引数なしでその関数を呼び出したい場合は、std::result_of(C ++ 11)またはを使用してboost::result_ofください。

于 2013-03-10T20:32:41.200 に答える