2015-07-07 13 views
6

Una volta mi è stata fatta una domanda durante l'intervista.Ottieni il tipo da std :: string, C++

Quindi ho una funzione void f(std::string) e chiamo una funzione come questa f("int"). In modo che la mia funzione deve creare un locale int x nel suo corpo. C'è un modo per ottenere il tipo da const char*. So che boost::mpl::vector risolve questo tipo di problema. Qualcuno può dirmi la tecnica?

+1

Sembra che la risposta breve sia che il C++ non supporta la riflessione, ma scommetto che ci sono alcune soluzioni alternative assurde che potresti sfruttare per l'intrattenimento degli intervistatori. Dai un'occhiata a http://stackoverflow.com/questions/41453/how-can-i-add-reflection-to-ac-application for reflection – Catalyst

+0

Penso che sia ancora interessante se qualcuno possa dare una soluzione "semplice" per questa domanda. – coincoin

risposta

3

Se si suppone che i tipi definiti dall'utente siano supportati, non è possibile senza una mappatura esplicita fornita. Ma per i soli tipi built-in, può essere fatto. È possibile implementare un parser per le definizioni di tipo e combinarlo con i modelli di funzione, costruendo il tipo in modo iterativo. Qualcosa di simile a questo:

template <class T> 
void parseType(std::string type) 
{ 
    std::string spec = extractOneSpecifierFrom(type); 
    if (spec == "[]") { 
    parseType<T[]>(type); 
    } else if (spec == "*") { 
    parseType<T*>(type); 
    } else if (spec == "const") { 
    parseType<const T>(type); 
    } // ... etc. 
} 
1

La mia impressione di questa domanda è:

  • Creazione di un int locale viene fatto durante la fase di compilazione.

  • L'argomento s in f (std :: string s) è dati di runtime.

Così a meno che state controllando la corda durante il runtime e la selezione di un blocco, o un modello predefinito, con un int, come

if (s == "int"){ 
    // declare int 
    int i; 
} 

non c'è modo ragionevole per farlo.

Per avere il codice oggetto con tutti i tipi di dati possibili disponibili durante la compilazione, mi sembra che vada contro lo spirito della domanda.

Ora, con le lingue che riflettono correttamente la soluzione è in gran parte banale. Object intObject = Class.forName(s).newInstance();

0

Ho pensato di recente anche a questo. Ho trovato un membro della classe che è stato lanciato all'inizio di ogni metodo basato su una stringa e su un blocco/else.

void* data; 
string cast; //set cast with some method, could also be enum. 
//make methods and/or overloads with cast blocks