5
関数を引数とするテンプレート関数があるとしましょう(これはstd :: function、またはラムダ、または実際の関数ポインタ)。問題を示している愚かな例:C++ 11 result_ofに似たfirst(second、etc ...)引数の型を取得します
template<typename F,typename A,typename B = typename std::result_of<F(A)>::type>
B blabla(F &&f)
{
return f(A())/3;
}
私はAのタイプがありますが、私はタイプAを推測するようにコンパイラに希望与えられ、STDとFの戻り値の型:: result_of ::型名を参照することができますFの最初の議論から。 (私は
template<typename A,typename B>
B blabla(const std::function<B(A)> &f)
{
return f(A())/3;
}
を記述する場合、コンパイラはので、これはそれを行うには正しい方法ではありませんが、AとB(それはSTDない場合は特に::機能が、ラムダ)を推測問題を抱えている。)
これは問題を説明していますか? https://stackoverflow.com/questions/27851111/why-cant-i-pass-a-lambda-to-this-function-which-takes-a-stdfunction – 5gon12eder
...またはこれ:https:// stackoverflow。 com/questions/26665152/compiler-does-not-deduce-template-parameters-map-stdvector-stdvectorを参照してください。 – WhozCraig
あなたがリストアップした3つのケース( 'std :: function'、C++ 11(非ジェネリック)ラムダ、プレーン関数ポインタ)に限られていますが、これは実行可能ですが、任意のファンクタまたは汎用ラムダに一般化することは不可能です。 –