2014-12-16 13 views
6

Cú pháp thích hợp để xác định kết quả của một cái gì đó như -int() hoặc double()*double() qua result_of là gì?std :: result_of cho các toán tử cài sẵn

này không

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

Thay vào đó, bạn có thể sử dụng 'decltype'. – Jarod42

+0

@ b4hand 'typename' chỉ cần thiết nếu các đối số được truyền cho mẫu phụ thuộc vào tham số mẫu. 'int' và' double' không phụ thuộc. – Casey

Trả lời

8

std::result_of thực sự không phải là cách tiếp cận để tận đây. decltype thực hiện chính xác những gì bạn muốn và có thể được sử dụng làm decltype(-int()), decltype(double()*double()) v.v. Nếu bạn không biết loại có thể định cấu hình mặc định hay không, bạn cũng có thể sử dụng std::declval: decltype(-std::declval<int>()).

Lý do bất kỳ cú pháp nào liên quan đến operator- sẽ không hoạt động do cú pháp operator- chỉ hoạt động đối với các toán tử bị quá tải tùy chỉnh. Các toán tử dựng sẵn không có bất kỳ chức năng sao lưu nào có thể được tham chiếu đến.

3

decltype chắc chắn là con đường để đi ở đây, nhưng nếu bạn phải sử dụng result_of, nó có thể được thực hiện bằng cách sử dụng các function objects quy định tại <functional>

Ví dụ, để có được những loại quả của double * double, sử dụng

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

Tương tự như vậy, phủ định unary sẽ

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

Với C + 14, thậm chí bạn có thể truy vấn các loại kết quả của một phép toán trên hai loại khác nhau

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

Dĩ nhiên, kỹ thuật này tương tự có thể được sử dụng cho người sử dụng các loại định nghĩa là cũng

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

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

Live demo

Các vấn đề liên quan