2014-12-16 6 views
6

Каков правильный синтаксис для определения результата чего-то вроде -int() или double()*double() через result_of?std :: result_of для встроенных операторов

Это не удается

std::result_of<operator-(int)>::type 
std::result_of<operator*(double,double)>::type 
+0

Вместо этого вы можете использовать 'decltype'. – Jarod42

+0

@ b4hand 'typename' необходимо, только если аргументы, переданные шаблону, зависят от параметров шаблона. 'int' и' double' не зависят. – Casey

ответ

8

std::result_of действительно не подход взять здесь. decltype делает именно то, что вы хотите, и может использоваться как decltype(-int()), decltype(double()*double()) и т. Д. Если вы не знаете, является ли тип по умолчанию конструктивным, вы также можете использовать std::declval: decltype(-std::declval<int>()).

Причина, по которой любой синтаксис с участием operator- не будет работать, потому что синтаксис operator- работает только для пользовательских перегруженных операторов. Встроенные операторы не имеют никакой функции поддержки, на которую можно ссылаться.

3

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