しかし、関数の型として何を使用すべきかわかりませんか?
関数型は のようになりfloat(float)
ます。
それとも戻り値の型ですか?最新の C++ では、戻り値の型を推測できます。
template <typename F>
auto Eval(const F & f) -> decltype(f(3.14)) {
return f(3.14);
}
古いバージョンの言語に固執している場合は、かなりトリッキーです。単純な関数、およびresult_type
定義を含む関数型 ( から派生したものなどstd::unary_function
)にオーバーロードを提供できます。
template <typename Ret, typename Arg>
Ret eval(Ret (&f)(Arg)) {return f(3.14);}
template <typename F>
typename F::result_type eval(F const & f) {return f(3.14);}
おそらく、特性クラスを定義するか、Boost の関数特性を使用して、これを一般化します
では、次のように呼び出す必要がありますか?
その名前の関数が 1 つしかない場合は、引数依存のルックアップを使用できます。
Eval(sin);
ただし、これがstd::sin
の場合、複数のオーバーロードがあるため、型を指定する必要があります。
Eval<float(float)>(sin);
さらに、なぜポインター (& 記号) を使用するのでしょうか。
私たちはしません。これはポインタではなく参照です。
引数を変更したいので、引数を参照渡ししますか?
いいえ。これは への参照const
であるため、変更できません。
そうでない場合、なぜ & 記号が必要なのですか?
一部の型はコピーにコストがかかります。他のものはまったくコピーできません。ただし、すべての型は参照によって渡すことができます。したがって、完全に汎用的な関数テンプレートは、すべての型で使用できるようにするために、参照によって引数を取る必要があります。