我想寫一個模板函數,它接受2個值和一個函子或一個lambda。 函數使用這些值調用函數並返回結果。如何推斷函子返回值的類型?
template <typename T, typename Fn>
_ReturnTypeOfPred_ Apply(T x, T y, Fn fn)
{
return fn(x, y);
}
問:我如何定義的Apply
返回類型成爲等於Fn
返回類型?它不一定等於T
,如仿
template <typename T>
auto Sum(T x, T y) -> decltype(x+y)
{
return x+y;
}
更新
首屆例子是過於簡單化的這個例子。 這個應該工作嗎?
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());
}
想如果我在返回類型的decltype
重複return
表達它總是工作?有沒有更優雅的方式?
下劃線的大寫名稱保留用於實施。你不能在你自己的代碼中使用它們。 – 2012-08-17 12:32:46
@KerrekSB:它是一個佔位符,不是一個真實的代碼 – Andrey 2012-08-17 12:34:08
好的函子(比如那些在STL中的)總是定義它們的'return_type',所以你可以使用'Fn :: return_type'。但我知道你想要一個也適用於不那麼好的函數的答案。 – Gorpik 2012-08-17 12:34:34