@booster sagte in Kann ich mit der typeid einer Klasse eine Instanz erzeugen:
Es geht halt darum dass der Enum und die Klassen später erweitert werden müssen. Da ist das mit dem switch case immer etwas unschön.
Es muss immer irgendwo irgendwas erweitert werden. So lange der Code sich im selben Modul befindet wie der enum, ist es mMn. mehr oder weniger egal ob man nen switch oder ne map verwendet. Bzw. switch hat sogar nen Vorteil: mit den passenden Compiler-Switches bekommst du eine Warnung wenn du den enum erweiterst, aber vergisst den case beim switch dazuzumachen.
Bei GCC ist das z.B. -Wswitch (enthalten in -Wall).
Bei MSVC musst du die extra aufdrehen, z.B. mit /W4 /w44061 /w44062.
Beispiel:
enum class Foo {
A,
B,
C,
};
int ok(Foo f) {
switch (f) {
case Foo::A: return 1;
case Foo::B: return 2;
case Foo::C: return 3;
}
return 0;
}
int warn(Foo f) {
switch (f) {
case Foo::A: return 1;
case Foo::B: return 2;
}
return 0;
}
https://godbolt.org/z/cd49vxrhz
Wichtig dabei ist dass es kein default Label gibt -- denn sonst kommt bei GCC keine Warnung.
Aber ja kann schon schneller sein.
Aber ist der Fall wirklich so ungewöhnlich? Das ist doch das Factory Pattern.
Ungewöhnlich nicht. Die Frage ist für mich aber ob du diese Komplexität brauchst. Also ob sie einen Vorteil bringt.
Es gibt natürlich Fälle wo das Sinn macht bzw. sogar notwendig ist. Stell dir z.B. ein GUI Framework vor, welches zur Laufzeit anhand von "Beschreibungen" (XML Files, ...) GUI Elemente zusammenbaut. Sowas sollte natürlich von ausserhalb des Frameworks erweiterbar sein, damit man seine eigenen Control-Klassen implementieren und verwenden kann. Da funktioniert natürlich ein einfaches switch-case im Framework-Code nicht. Denn das Framework kann ja die Control-Klassen die man selbst dazubastelt nicht kennen.
Bzw. auch bei Anwendungen kann es Sinn machen. Ab einer bestimmten Grösse ist es u.U. nicht mehr wünschenswert wenn alle abgeleiteten Klassen an einem zentralen Punkt bekannt sein müssen.
Aber so lange alles halbwegs übersichtlich bleibt, gibt es mMn. keinen echten Vorteil durch die Verwendung einer map. Echte Nachteile aber schon (z.B. komplexer, keine Warnings wenn man was vergisst).