2016-07-19 86 views
7

Considerare il seguente esempio. Da qualche parte nel mio codice è un nome x. Non ho idea se x sia un tipo o un oggetto (potrebbe essere entrambi). C'è un modo per ottenere il tipo di x, ad esempio x se x è un tipo o decltype(x) se x è un oggetto?Ottenere il tipo di un typename o un'espressione

Ho provato a fare qualcosa di così banale come

decltype(int) 

ma questo produce un errore, dal momento che int non è espressione. C'è qualche modo alternativo per farlo?

Vorrei qualcosa di simile:

typedef int l; 
mydecltype(l) x; // int x; 
mydecltype(x) y; // int y; 

Come posso ottenere questo fatto?

+6

Come hai fatto a finire con un nome per il quale non si sa se si tratta di un tipo o di un oggetto? Da dove viene questo nome? La dichiarazione del problema non ha senso per me; si sente come un [problema XY] (http://xyproblem.info/). –

+0

Volevo aggiungere altro sfondo ma la spiegazione sarebbe estremamente lunga. Sto lavorando con le direttive di preelaborazione e gli elenchi di inizializzazione su classi che ereditano da altre classi. In un elenco di inizializzazione, i tipi e i nomi dei membri hanno lo stesso formato e non riesco a distinguerli dalla sintassi. –

+0

È sicuramente un problema XY, ma non sarei in grado di descrivere l'intero problema, in quanto non è così semplice come "Ho bisogno di un'estensione del nome file" :) –

risposta

19
namespace detail_typeOrName { 
    struct probe { 
     template <class T> 
     operator T() const; 
    }; 

    template <class T> 
    T operator * (T const &, probe); 

    probe operator *(probe); 
} 

#define mydecltype(x) decltype((x) * detail_typeOrName::probe{}) 

In questo codice, (x) * detail_typeOrName::probe{} possono essere analizzati due modi:

  • Se x è una variabile, questo è x moltiplicato per l'istanza di probe.
  • Se x è un tipo, questa è l'istanza di probe dereferenziata e trasmessa a X.

Eseguendo un attento sovraccarico degli operatori, entrambe le interpretazioni sono valide e restituiscono il tipo che cerchiamo.

Live on Coliru

+0

Uomo, mi hai fatto venire la pelle d'oca. –

+1

Mi sento violato in modo positivo – Bl4ckb0ne

+0

Questo è follemente intelligente! Non avevo mai pensato di abusare del dereferimento E dell'operatore del cast in questo modo. Spero che questo non si interrompa in futuro e quindi deve essere affrontato da qualche sfortunato manutentore ignaro ... – akappa

Problemi correlati