String auf Enum Mappen
-
Ich muss gestehen, an einer TMP Lösung hätte ich durchaus Interesse. Leider weiß ich nicht wirklich wie das funktionieren sollte.. niemand eine Idee? Nach dem TMP Brainfuck Interpreter sollte das doch möglich sein.
-
cooky451 schrieb:
Ich muss gestehen, an einer TMP Lösung hätte ich durchaus Interesse. Leider weiß ich nicht wirklich wie das funktionieren sollte.. niemand eine Idee? Nach dem TMP Brainfuck Interpreter sollte das doch möglich sein.
Leider hat C++ keine Compile-Time-Reflection. In D würde das gehen.
-
Natuerlich geht sowas. Nur leider nicht automatisch. Man muesste eben String-Werte selbst angeben.
-
Ich hatte ein bisschen Langeweile, also habe ich sowas gleich mal implementiert.
Verwendungsbeispiel:
#include <iostream> enum struct my_enum : unsigned { foo, bar, baz, qux, }; // Zum ueberpruefen std::ostream& operator << (std::ostream& os, my_enum e) { static char const* const table[] = { "foo", "bar", "baz", "qux" }; return os << table[static_cast<unsigned>(e)]; } int main() { typedef tmp::enum_mapper < my_enum, // Reihenfolge der Eintraege egal, wird intern sowieso sortiert EMAP(my_enum::baz, 'b','a','z'), EMAP(my_enum::bar, 'b','a','r'), EMAP(my_enum::foo, 'f','o','o'), EMAP(my_enum::qux, 'q','u','x') > my_enum_mapper; my_enum_mapper mapper; std::cout << mapper("foo") << '\n'; std::cout << mapper("bar") << '\n'; std::cout << mapper("baz") << '\n'; std::cout << mapper("qux") << '\n'; try { std::cout << mapper("garbage") << '\n'; } catch(std::invalid_argument const& iv) { std::cout << iv.what() << '\n'; } }
foo
bar
baz
qux
string 'garbage' has no enum valueAuf Zeit messen habe ich allerdings jetzt keine Lust mehr, das darf jemand anderes machen. :xmas1:
-
Der ganze Aufwand...und dann wird doch insgesamt 10 mal strcmp aufgerufen.
-
Dann mach mal einen Vorschlag, wie man es besser machen koennte...
-
Der nächste Schritt wäre, einen Compile-Time-Trie aufzubauen.
-
Genau das mache ich doch durch die Rekursion?!
-
Ich habe mal dem enum ball hinzugefügt und ein paar Debugausgaben gemacht:
cmp ball with baz
cmp ball with bar
cmp ball with ballHier ist es eigentlich nicht nötig, die ersten zwei Zeichen zu vergleichen. Besser:
cmp ll with z
cmp ll with r
cmp ll with llDas meinte ich mit Trie (!= Tree).
Btw: Dein "struct constant" ist das gleiche wie std::integral_constant.
-
@cooky451: Definiere doch mal
static animal_selector selector
ausserhalb der Funktion als echte globale Variable und messer erneut. Bei der aktuellen Variante sollte ein Guard bzw. eine if-Abfrage generiert werden, die bei diesem Spielzeugbeispiel eine Menge Zeit kosten koennte.