2015-11-08 24 views
7

Ho un qualche struct:Come ottenere il tipo di ritorno del metodo sovraccarico in C++?

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

voglio ottenere il return-tipo di f() utilizzare in fase di compilazione aiutanti. Sto cercando std::result_of<>:

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

Ma il compilatore mi dà un errore ragionevole: "riferimento alla funzione di sovraccarico non può essere risolto".

Così ho andare a SO e vedere this accettato e upvoted risposta, che suggeriscono di fare un static_cast<ComplicatedType1 (A::*)()>(&A::f) - ma io non avere un ComplicatedType1 a questo punto. Sono bloccato in una ricorsione.


Come arrivare ComplicatedType1 dentro la mia using espressione con un minimo di codice?

+3

Potrebbe essere un lavoro per decltype? –

+1

Non puoi usare la deduzione di tipo con la parola chiave 'auto'? –

+0

'std :: result_of' si aspetta come argomento template un * tipo *, ma' & A :: f' non è un tipo; nessuno dei due è '(& A :: f)()'. Inoltre, 'result_of' è uno speciale strumento pre-C++ 11 e sostituito da' decltype' per la maggior parte delle applicazioni: 'decltype (f())' – dyp

risposta

12

Quello è un lavoro per 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: Cambiato per ottenere tipo di ritorno di f() (al posto di f (int)) e C++ 11 (invece di C++ 14) su Coliru