2015-11-08 22 views
7

Mam gdzieś struct:Jak uzyskać typ zwrotu przeciążonej metody w C++?

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

Chcę uzyskać return-typ f() użyciu kompilacji pomocników. Próbuję std::result_of<>:

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

Ale kompilator daje mi wystarczającą błąd: „odniesienie do funkcji przeciążonej nie może być rozwiązany”.

Więc idę do SO i widzę this akceptowaną i przegłosowaną odpowiedź, która sugeruje, że należy wprowadzić static_cast<ComplicatedType1 (A::*)()>(&A::f) - ale nie mam w tym momencie ComplicatedType1. Utknąłem w rekursji.


Jak zdobyć ComplicatedType1 wewnątrz mojego using ekspresji przy minimum kodu?

+3

Czy to może być praca dla osób decltype? –

+1

Nie możesz użyć odliczenia ze słowem kluczowym 'auto'? –

+0

'std :: result_of' oczekuje jako argument szablonu a * type *, ale' & A :: f' nie jest typem; nie jest też '(& A :: f)()'. Ponadto 'result_of' jest specjalnym narzędziem przed C++ 11 i zastąpione przez' decltype' dla większości aplikacji: 'decltype (f())' – dyp

Odpowiedz

12

Ów to zadanie dla 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: Zmieniono aby zwracany typ f() (zamiast f (int)) i C++ 11 (zamiast C++ 14) na Coliru