To pytanie jest kontynuacją How to deduce the type of the functor's return value? Przeformułowuję je w bardziej abstrakcyjny sposób.Ogólny sposób na dedukcję typu zwrotu funktora?
Biorąc pod uwagę Pseudokod z funkcji szablonu
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(<decl-expr>)
{
// do something
// ............
return fn(<ret-expr>)
}
gdzie <ret-expr>
jest arbitralne wyrażenie, które wiąże arg
, co będę używał do <decl-expr>
aby ustawić typ zwracanej ComputeSomething
równą typu powrotnej funktora.
Funktor może być klasą, wskaźnikiem lambda lub funkcją.
Częściowe rozwiązania, które znalazłem do tej pory.
(a) Odpowiedź na moje powiązane pytanie wykonane przez ecatmur. Zasadniczo jest to powtórzenie oświadczenia zwrotu w <decl-expr>
. Problemy: jest podatny na błędy i nie działałby, gdyby zawierał zmienne lokalne.
(b) działa tylko wskaźników funkcji
template <typename Arg, typename Ret>
Ret ComputeSomething(Arg arg, Ret(*fn)(Arg))
(C), to zakłada się, że argument funktora jest typu Arg
(które mogą posiadać ogólnie) i wymaga Arg
być Default constructible
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(fn(Arg())
(d) Korzystanie std::declval
która ma podnieść domyślną-constructible ograniczenie, jak zasugerowano w how to deduce the return type of a function in template. Czy ktokolwiek mógłby wyjaśnić, jak to działa?
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(fn(std::declval<Arg>())
przykro mi to mówić, ale AFAIK nie jest to możliwe, ponieważ powrót spływu nie zobaczyć szablon funkcja jest określona, natomiast ciało to robi. –