2014-12-16 18 views
6

Jaka jest właściwa składnia dla określenia wyniku takiego jak -int() lub double()*double() poprzez result_of?std :: result_of dla operatorów wbudowanych

To nie

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

Zamiast tego możesz użyć 'decltype'. – Jarod42

+0

@ b4hand "nazwa_pliku" jest niezbędny tylko wtedy, gdy argumenty przekazane do szablonu zależą od parametrów szablonu. 'int' i' double' nie są zależne. – Casey

Odpowiedz

8

std::result_of nie jest to podejście do podjęcia tutaj. decltype robi dokładnie to, czego oczekujesz i może być używany jako decltype(-int()), decltype(double()*double()) itd. Jeśli nie wiesz, czy typ jest domyślnie konfigurowalny, możesz również użyć std::declval: decltype(-std::declval<int>()).

Przyczyną, że dowolna składnia dotycząca operator- nie działa, ponieważ składnia operator- działa tylko w przypadku niestandardowych przeciążonych operatorów. Wbudowane operatory nie mają żadnej funkcji pomocniczej, do której można się odnieść.

3

decltype jest zdecydowanie do zrobienia tutaj, ale jeśli trzeba użyć result_of, można to zrobić za pomocą function objects zdefiniowany w <functional>

Na przykład, aby uzyskać wynikowy typ double * double użyć

std::result_of<std::multiplies<double>(double, double)>::type 

Podobnie jednoargumentowy negacja być

std::result_of<std::negate<int>(int)>::type 

z C + +14, można nawet zapytać wynikowy typ operacji matematycznych na dwóch różnych typach

std::result_of<std::plus<>(double, int)>::type 

Oczywiście, ta sama technika może być stosowana dla typów zdefiniowanych przez użytkownika, jak również

struct foo{}; 
struct bar{}; 
bar operator/(foo, foo) { return bar{}; } 

std::result_of<std::divides<>(foo, foo)>::type 

Live demo

Powiązane problemy