decltype
, безусловно, путь здесь, но если вы должны использовать result_of
, это может быть сделано с помощью function objects, определенного в <functional>
Например, чтобы получить результирующий тип double * double
используйте
std::result_of<std::multiplies<double>(double, double)>::type
Аналогичным образом, отрицание унарный бы
std::result_of<std::negate<int>(int)>::type
С C + +14, вы даже можете запросить результирующий тип математической операции на двух различных типах
std::result_of<std::plus<>(double, int)>::type
Конечно, этот же метод может быть использован для определенных пользователем типов, а также
struct foo{};
struct bar{};
bar operator/(foo, foo) { return bar{}; }
std::result_of<std::divides<>(foo, foo)>::type
Live demo
Вместо этого вы можете использовать 'decltype'. – Jarod42
@ b4hand 'typename' необходимо, только если аргументы, переданные шаблону, зависят от параметров шаблона. 'int' и' double' не зависят. – Casey