2016-07-28 12 views
1

Ich habe die folgende Funktion in einer C++ Anwendung, die viele verschiedene Zeiten aufgerufen:einziehe Vorlage Typname Objekt in C++

template<typename The_ValueType> 
void 
handleObject(The_ValueType const &the_value) //unchangable function signature 
{ 
    /* 
     //Pseudo Java code (not sure how to implement in C++) 
     if (the_value instanceof Person){ 
      Person person = (Person) the_value  
      //do something with person 
     } 
     if (the_value instanceof Integer){ 
      int theInt = (Integer) the_value 
      //do something with int 
     } 
    */ 
} 

Ich brauche einige Debug-Informationen aus dem „the_value“ Objekt auszudrucken. Leider bin ich von einem Java/JavaScript-Hintergrund, und ich bin furchtbar ineffizient und unkenntlich mit C++. Wenn ich versuche, in C++ zu reduzieren, erhalte ich den Fehler "ungültiger Zieltyp für dynamic_cast". Wie kann der "Pseudo-Java-Code" implementiert werden? Im Grunde muss ich nur wissen, wie man den Downcast macht, sei das Objekt ein Primitiv oder ein Objekt. Ich reiße mir die Haare aus und versuche, Hinweise und Casting zu verstehen, und jede Anleitung würde sehr geschätzt werden.

+0

-Code wie diese, die in Java ziemlich häufig sein kann, ist ein Anti-Muster in C++. Wenn für Ihr Design ein hartcodierter Runtime-Variablenversand erforderlich ist, verbessern sich Ihre Designanforderungen wahrscheinlich. –

Antwort

5

Es gibt nichts über Downcasting hier. Sie sollten template specialization verwenden:

template<typename The_ValueType> 
void 
handleObject(const The_ValueType &the_value) 
{ 
    // default implementation: do nothing or something else 
} 

template<> 
void 
handleObject<Person>(const Person &the_value) 
{ 
    //do something with the_value as Person 
} 

template<> 
void 
handleObject<int>(const int &the_value) 
{ 
    //do something with the_value as int 
} 

Oder noch besser, wenn alle Arten bekannt sind, können Sie eine Überlastung:

void handleObject(const Person &the_value) 
{ 
    //do something with the_value as Person 
} 

void handleObject(const int &the_value) 
{ 
    //do something with the_value as int 
} 
+0

Ja, das war sehr hilfreich und hat mir viel Zeit gespart. – user64141

+0

Überladung wäre noch besser. – Jarod42