Chciałbym napisać funkcję szablonu, która akceptuje 2 wartości i funktora lub lambda. Funkcja wywołuje funktor z tymi wartościami i zwraca wynik.Jak wywnioskować typ wartości zwracanej przez funktor?
template <typename T, typename Fn>
_ReturnTypeOfPred_ Apply(T x, T y, Fn fn)
{
return fn(x, y);
}
Pytanie: W jaki sposób można określić typ zwracanej Apply
stać równa typu zwracanej Fn
? To niekoniecznie jest równa T
, jak w tym przykładzie funktora
template <typename T>
auto Sum(T x, T y) -> decltype(x+y)
{
return x+y;
}
aktualizacji
The 1st przykład został uproszczony. Czy to powinno zadziałać?
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());
}
Czy to zawsze działa, jeśli powtarzam return
wyraz w decltype
zwracanego typu? Czy istnieje bardziej elegancki sposób?
Podkreślone nazwy kapitału są zarezerwowane dla implementacji. Nie wolno ich używać we własnym kodzie. –
@KerrekSB: To był symbol zastępczy, a nie prawdziwy kod – Andrey
Dobre funktory (takie jak te w STL) zawsze definiują ich 'return_type', więc możesz po prostu użyć' Fn :: return_type'. Ale rozumiem, że chcesz odpowiedzi, która działa również dla niezbyt dobrych funktorów. – Gorpik