2013-01-05 9 views
8

Hier geht es: Ich möchte eine Void-Funktion erstellen, die zwei bekannte Arten von Werten erhalten wird und eine andere, die alles Mögliche sein kann. Der Code würde wie folgt sein:C++ senden Sie einen beliebigen Argumenttyp an eine Funktion

void change_settings(string element, short setting, ??? value) { 
    switch (setting) { 
     case ST_NAME: 
      // Cast value to string or char* and change element.name 
     break; 
     case ST_AMOUNT: 
      // Cast value to integer and change element.amount 
     break; 
     case ST_ENABLED: 
      // Cast value to boolean and change element.enabled 
     break; 
    } 
} 

I tryied den Wertes des Typen const void* zu machen, aber ich erhalte eine Fehlermeldung (cast from ‘const void*’ to ‘short int’ loses precision), weil ich diese gerade tat short name = (short)value, die einigen verrückten verzweifelten Versuch sein muss, in der Hoffnung, Glück zu haben . Nun, ich weiß nicht, ob es eine Möglichkeit gibt, dies zu tun, den Zeiger irgendeiner Variablen zu übergeben und ihn dann zu dem zu machen, was er ist (ich kenne den Typ der zu erwartenden Variablen je nach Fall.) Wie würde ich das machen? ? Dank

Antwort

7

Da Sie scheinen im Voraus alle potenziellen Arten von value, und Sie möchten ein anderes Verhalten abhängig von der Art zu wissen, können Sie einfach eine Reihe von Funktions Überlastungen schreiben:

void change_settings(const std::string& element, short setting, const std::string& value); 

void change_settings(const std::string& element, short setting, int value); 

void change_settings(const std::string& element, short setting, bool value); 

Dies beseitigt die Notwendigkeit für einen Laufzeitschalter

+0

verwenden, das ist wahr, aber an diesem Punkt, warum der Schalter Fall nicht eine andere Funktion für jede Einstellung erstellen und vermeiden. – Caesar

+0

Ja - es macht die Variable 'setting' unnötig. –

+1

Lass es uns versuchen. Natürlich kann ich auch switch und setting verwenden, wenn ich verschiedene Fälle habe, wo ich einen int-Wert benötige, zum Beispiel – ali

5

Angenommen, Sie sprechen über Laufzeit switc Hing (im Gegensatz zur Kompilierungszeit, in diesem Fall sind Vorlagen wahrscheinlich die Antwort):

Sie könnten eine Variantenklasse (z. boost::variant), oder vielleicht Polymorphismus (d. H. Definieren eine Vererbungshierarchie und virtuelle Funktionen, um die spezifischen Verhaltensweisen zu implementieren).

+0

Ich nehme an, dies ist die professionelle Art, dies zu tun, aber ich werde es im Auge behalten, wenn ich eine ernsthafte Anwendung erstelle. Danke – ali

+0

du meinst 'boost :: any' als zweite Option?> – Puppy

12

sollten Sie templates

template <typename T> 
void change_settings(string element, short setting, T value); 
+0

Großartig! Vielen Dank! Das würde es tun – ali

+2

Das Problem ist, dass die Besetzung in seinem Laufzeit-Switch-Code nicht kompilieren wird, wenn "T" der falsche Typ ist. Ich würde nur eine Reihe von Funktionsüberlastungen schreiben –

+0

In der Tat, das ist was passiert. – ali

Verwandte Themen