Различие между станд.:: result_of и decltype

Я испытываю некоторые затруднения при понимании потребности в 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.
  • знайте определенного конструктора для функтора.

Действительно ли я прав в размышлении что единственная разница между decltype и result_of это - первые потребности выражение, тогда как второе не делает?

97
задан Luc Touraille 22 October 2010 в 07:41
поделиться

1 ответ

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;
    };
84
ответ дан 24 November 2019 в 05:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: