Я испытываю некоторые затруднения при понимании потребности в std::result_of
в C++ 0x. Если я понял правильно, result_of
используется для получения получающегося типа вызова функционального объекта с определенными типами параметров. Например:
template <typename F, typename Arg>
typename std::result_of<F(Arg)>::type
invoke(F f, Arg a)
{
return f(a);
}
Я действительно не вижу различия со следующим кодом:
template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(f(a)) //uses the f parameter
{
return f(a);
}
или
template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(F()(a)); //"constructs" an F
{
return f(a);
}
Единственная проблема I видит с этими двумя решениями, то, что мы должны также:
Действительно ли я прав в размышлении что единственная разница между decltype
и result_of
это - первые потребности выражение, тогда как второе не делает?
result_of
был введен в Boost , а затем включен в TR1 ] и, наконец, в C ++ 0x. Следовательно, result_of
имеет преимущество, которое обратно совместимо (с подходящей библиотекой).
decltype
- это совершенно новая вещь в C ++ 0x, она не ограничивается только типом возвращаемого значения функции и является особенностью языка.
В любом случае, в gcc 4.5 result_of
реализован в терминах decltype
:
template<typename _Signature>
class result_of;
template<typename _Functor, typename... _ArgTypes>
struct result_of<_Functor(_ArgTypes...)>
{
typedef
decltype( std::declval<_Functor>()(std::declval<_ArgTypes>()...) )
type;
};