Ich habe einige Probleme, die Notwendigkeit für std::result_of
in C++ 0x zu verstehen. Wenn ich richtig verstanden habe, wird result_of
verwendet, um den resultierenden Typ des Aufrufs eines Funktionsobjekts mit bestimmten Arten von Parametern zu erhalten. Zum Beispiel:Unterschied zwischen std :: result_of und declltype
template <typename F, typename Arg>
typename std::result_of<F(Arg)>::type
invoke(F f, Arg a)
{
return f(a);
}
ich nicht wirklich den Unterschied mit dem folgenden Code sehen:
template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(f(a)) //uses the f parameter
{
return f(a);
}
oder
template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(F()(a)); //"constructs" an F
{
return f(a);
}
Das einzige Problem, das ich mit diesen beiden Lösungen sehen kann, ist, dass wir müssen entweder:
- haben eine Instanz des Funktors, um es in dem Ausdruck zu verwenden, der an decltype übergeben wird.
- kenne einen definierten Konstruktor für den Funktor.
Bin ich recht in der Annahme, dass der einzige Unterschied zwischen decltype
und result_of
ist, dass der erste einen Ausdruck benötigt, während der zweite nicht der Fall ist?
Ok, es ist also hauptsächlich eine Convenience-Klasse, um den hässlichen Ausdruck in decltype zu vermeiden, oder? –
@Luc: Ja. :) (Spät!) – GManNickG
@GMan: Besser spät als nie;)! –