2015-07-07 24 views
6

Po zadaniu mi pytania w trakcie rozmowy kwalifikacyjnej.Uzyskaj typ z std :: string, C++

Z tego powodu mam funkcję void f(std::string) i wywołuję funkcję jako ta f("int"). Aby moja funkcja musiała utworzyć lokalny int x w swoim ciele. Czy istnieje sposób, aby uzyskać typ z const char*. Wiem, że boost::mpl::vector rozwiązuje ten problem. Czy ktoś może mi powiedzieć tę technikę?

+1

Wygląda na to, że krótka odpowiedź brzmi, że C++ nie obsługuje refleksji, ale założę się, że istnieje kilka absurdalnych rozwiązań, które można wypompować na potrzeby wywiadu. Spójrz na http://stackoverflow.com/questions/41453/how-can-i-add-reflection-to-ac-aplication for reflection – Catalyst

+0

Myślę, że nadal jest interesujące, jeśli ktoś może podać "proste" możliwe rozwiązanie na to pytanie. – coincoin

Odpowiedz

3

Jeśli typy zdefiniowane przez użytkownika mają być obsługiwane, nie jest to możliwe bez jawnego przypisania mapowania. Ale tylko dla wbudowanych typów można to zrobić. Możesz zaimplementować analizator składni definicji typów i połączyć go z szablonami funkcji, konstruując typ iteracyjnie. Coś takiego:

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

Mam wrażenie to pytanie brzmi:

  • Tworzenie lokalnej int odbywa się na etapie kompilacji.

  • Argumentem s do f (std :: string s) są dane środowiska wykonawczego.

Więc jeśli jesteś kontroli ciąg podczas wykonywania i wyboru blok lub gotowego szablonu, z int, jak

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

istnieje żaden rozsądny sposób, aby to zrobić.

Posiadanie kodu obiektowego z każdym możliwym typem danych dostępnych podczas kompilacji wydaje mi się sprzeczne z duchem pytania.

Teraz, w językach, które mają właściwą refleksję, rozwiązanie jest głównie trywialne. Object intObject = Class.forName(s).newInstance();

0

Ostatnio o tym pomyślałem. Wpadłem na członka klasy, który jest rzutowany na początku każdej metody na podstawie jakiegoś ciągu znaków, a jeśli/else blokuje.

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