Frage

In anderen .NET-Sprachen wie C # Sie auf einem String-Wert umschalten können:

string val = GetVal();
switch(val)
{
case "val1":
  DoSomething();
  break;
case "val2":
default:
  DoSomethingElse();
  break;
}

Dies scheint nicht der Fall in C ++ / CLI zu sein

System::String ^val = GetVal();
switch(val)  // Compile error
{
   // Snip
}

Gibt es ein spezielles Schlüsselwort oder eine andere Art und Weise, diese Arbeit für C ++ / CLI zu machen, wie es in C # das?

War es hilfreich?

Lösung

Eigentlich kann man alles andere als ganze Zahlen verwenden (manchmal durch integrale Typen bezeichnet), wenn die getesteten Objekte definiert Umwandlung in Integer.

String-Objekt nicht.

Sie können jedoch eine Karte mit String-Schlüssel erstellen (überprüfen, ob der Vergleich gut verarbeitet) und Zeiger auf Klassen eine Schnittstelle als Werte der Umsetzung:

class MyInterface {
  public:
    virtual void doit() = 0;
}

class FirstBehavior : public MyInterface {
  public:
    virtual void doit() {
      // do something
    }
}

class SecondBehavior : public MyInterface {
  public:
    virtual void doit() {
      // do something else
    }
}

...
map<string,MyInterface*> stringSwitch;
stringSwitch["val1"] = new FirstBehavior();
stringSwitch["val2"] = new SecondBehavior();
...

// you will have to check that your string is a valid one first...
stringSwitch[val]->doit();    

Ein bisschen lang zu implementieren, aber gut gestaltet.

Andere Tipps

Sie können sicherlich nichts anderes als eine ganze Zahl in einer switch Anweisung in C / C ++ verwenden. Der einfachste Weg, dies in C ++ zu tun ist, zu verwenden und if ... else-Anweisung:

std::string val = getString();
if (val.equals("val1") == 0)
{
  DoSomething();
}
else if (val.equals("val2") == 0)
{
  DoSomethingElse();
}

Edit:

Ich entdeckte gerade gefragt Sie C ++ / CLI - ich weiß nicht, ob die oben noch gilt; es sicherlich nicht in ANSI C ++.

Ich denke, dass ich eine Lösung gefunden auf codeguru.com .

Ich weiß, dass meine Antwort ein wenig zu spät kommt, aber ich denke, das ist auch eine gute Lösung ist.

struct ltstr {
    bool operator()(const char* s1, const char* s2) const {
        return strcmp(s1, s2) < 0;
    }
};

std::map<const char*, int, ltstr> msgMap;

enum MSG_NAMES{
 MSG_ONE,
 MSG_TWO,
 MSG_THREE,
 MSG_FOUR
};

void init(){
msgMap["MSG_ONE"] = MSG_ONE;
msgMap["MSG_TWO"] = MSG_TWO;
}

void processMsg(const char* msg){
 std::map<const char*, int, ltstr>::iterator it = msgMap.find(msg);
 if (it == msgMap.end())
  return; //Or whatever... using find avoids that this message is allocated in the map even if not present...

 switch((*it).second){
  case MSG_ONE:
   ...
  break:

  case MSG_TWO:
  ...
  break;

 }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top