2015-11-08 13 views
7

Tôi có một đâu đó struct:Làm cách nào để lấy kiểu trả về của phương thức quá tải trong C++?

struct A { 
    ComplicatedType1 f(); 
    ComplicatedType2 f(int); 
}; 

Tôi muốn có được sự trở lại kiểu của f() sử dụng thời gian biên dịch những người giúp đỡ. Tôi đang thử std::result_of<>:

using Type = std::result_of<decltype(&A::f)()>::type; 

Nhưng trình biên dịch cho tôi một lỗi hợp lý: "tham chiếu đến chức năng quá tải không thể giải quyết được".

Vì vậy, tôi chuyển đến SO và xem this câu trả lời được chấp nhận và được bỏ phiếu, đề xuất thực hiện static_cast<ComplicatedType1 (A::*)()>(&A::f) - nhưng tôi không có số ComplicatedType1 tại thời điểm này. Tôi bị mắc kẹt trong một đệ quy.


Làm thế nào để có được ComplicatedType1 bên trong biểu using tôi với tối thiểu là mã?

+3

Đây có phải là công việc cho decltype không? –

+1

Bạn không thể sử dụng loại khấu trừ với từ khóa 'tự động'? –

+0

'std :: result_of' hy vọng là đối số mẫu của nó là * type *, nhưng' & A :: f' không phải là một loại; không phải là '(& A :: f)()'. Hơn nữa, 'result_of' là một công cụ pre-C++ 11 đặc biệt, và được thay thế bởi' decltype' cho hầu hết các ứng dụng: 'decltype (f())' – dyp

Trả lời

12

Thats là một công việc cho decltype + declval

#include <iostream> 
#include <type_traits> 
#include <utility> 

struct ComplicatedType1 {}; 
struct ComplicatedType2 {}; 

struct A { 
    ComplicatedType1 f(); 
    ComplicatedType2 f(int); 
}; 

int main() 
{ 
    using Type = decltype(std::declval<A>().f()); 
    static_assert(std::is_same<Type,ComplicatedType1>::value,"Oops"); 
} 

live at Coliru

EDIT: Thay đổi để có được kiểu trả về của f() (thay vì f (int)) và C++ 11 (thay vì C++ 14) trên Coliru

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