У меня есть некоторые проблемы с пониманием необходимости std::result_of
в С++ 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);
}
Единственная проблема, которую я вижу с этими двумя решениями, заключается в том, что нам нужно либо:
- имеет экземпляр функтора для использования его в выражении, переданном в decltype.
- знать определенный конструктор для функтора.
Правильно ли я полагаю, что единственное различие между decltype
и result_of
заключается в том, что первому нужно выражение, а второе - не?