На самом деле вы можете использовать что угодно, кроме целых чисел (иногда обозначаемых целочисленными типами), если тестируемые объекты определяют преобразование в целое число.
Строковый объект не.
Однако вы можете создать карту со строковыми ключами (проверьте, что сравнение хорошо обработано) и указателями на классы, реализующие некоторый интерфейс в качестве значений:
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();
Немного долго для реализации, но хорошо продумано.