2つの値とファンクタまたはラムダを受け入れるテンプレート関数を記述したいと思います。 関数は、これらの値を持つファンクタを呼び出し、その結果を返します。ファンクタの戻り値の型を推測する方法は?
template <typename T, typename Fn>
_ReturnTypeOfPred_ Apply(T x, T y, Fn fn)
{
return fn(x, y);
}
質問:どのように私はFn
の戻り値の型に等しくなるようにApply
の戻り値の型を定義することができますか?なお、第1実施例を単純化した
ファンクタ
template <typename T>
auto Sum(T x, T y) -> decltype(x+y)
{
return x+y;
}
更新のこの例のように、T
に必ずしも等しくありません。 これは動作しますか?私は戻り値の型のdecltype
にreturn
表現を繰り返した場合
template <typename TContainer, typename Fn>
auto Apply(const TContainer& x, const TContainer& y, Fn fn) -> decltype(fn(x.front(), y.front()))
{
return fn(x.front(), y.front());
}
は、それは常に動作しませんか?よりエレガントな方法がありますか?
実装のために下位の資本名が予約されている。あなた自身のコードでそれらを使用してはいけません。 –
@KerrekSB:これはプレースホルダであり、実際のコードではありません – Andrey
良いファンクタ(STLのものなど)は常に 'return_type'を定義していますので、' Fn :: return_type'を使うことができます。しかし、私は、あまりにも良いものではないファンクタのための答えがほしいと思っています。 – Gorpik