この質問は、ファンクターの戻り値の型を推測する方法のフォローアップです。 私はそれをより抽象的な方法で再定式化しています。
テンプレート関数の疑似コードを考える
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(<decl-expr>)
{
// do something
// ............
return fn(<ret-expr>)
}
where<ret-expr>
は を含む任意の式であり、 forの戻り値の型をファンクターの戻り値の型と等しく設定arg
するために何を使用しますか。<decl-expr>
ComputeSomething
ファンクターは、クラス、ラムダ、または関数ポインターの場合があります。
これまでに見つけた部分的な解決策。
(a) ecatmur によって行われた私のリンクされた質問に対する回答。本質的には、 の return ステートメントを繰り返してい<decl-expr>
ます。問題: エラーが発生しやすく、ローカル変数が含まれていると機能しません。
(b) 関数ポインタに対してのみ機能します
template <typename Arg, typename Ret>
Ret ComputeSomething(Arg arg, Ret(*fn)(Arg))
Arg
(c) ファンクターの引数が型(一般には成り立たない可能性があります) でありArg
、デフォルト構成可能である必要があると仮定します。
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(fn(Arg())
(d)テンプレート内の関数の戻り値の型を推定する方法でstd::declval
提案されているように、デフォルトで構築可能な制限を解除することになっている which を使用する。誰かがそれがどのように機能するか説明できますか?
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(fn(std::declval<Arg>())