Ich habe eine enum-Klasse
%Vor% Ich möchte prüfen, ob eine ganze Zahl in ein Foo
konvertiert werden kann.
Was wäre der ideale Weg, dies zu tun? Dies ist für die Laufzeitprüfung (die ganze Zahl ist noch nicht zur Kompilierzeit bekannt)
Offensichtlich kann ich das auf die harte Tour machen (schreibe eine Funktion bool CheckEnum(Foo);
mit einem big-ass-Schalter, der für alle Fälle außer dem Standard-true true zurückgibt), aber ich hatte einen eleganteren Mechanismus, der so viel Schreiben vermeidet. MPL oder Boost.Preprocessor
wäre eine vollkommen akzeptable Lösung, über die ich leider sehr wenig weiß
Es gibt keinen "idealen" Weg, dies zu tun. Alle Wege müssen mit manueller Arbeit verbunden sein.
Sie müssen eine Datenstruktur erstellen, die alle zulässigen Werte enthält. Suchen Sie dann diese Datenstruktur mit dem gewünschten Laufzeitwert. A std::set
oder std::unordered_set
wären für diesen Zweck ausreichend.
Ihre Hauptschwierigkeit besteht darin, diese Liste zu pflegen, da sie jedes Mal aktualisiert werden muss, wenn Sie Ihre enum class
ändern.
Ok, ich bin ein bisschen satt von diesem Problem (einige meiner Enums sind fast 100 Artikel) Also habe ich mich entschieden, es mit Code-Generierung anzugehen, die nicht jedermanns Sache ist, aber ich habe erkannt, dass das wirklich keine große Sache ist.
Grundsätzlich ging ich zu Python Cog , was mir erlaubt, Python-Snippets in Kommentare in meinen .h- und .cpp-Dateien einzubetten und Code automatisch generieren. Ich benutze es im Grunde wie ein wirklich schlaues, imperatives Makro-System:
Ich habe Folgendes zu Test.h
Dann habe ich den cog-Aufruf in meinem Makefile-Pre-Build-Schritt hinzugefügt:
%Vor%Und die Ergebnisse erscheinen direkt darunter:
%Vor%Nun, meine enum-Validierung besteht darin, sicherzustellen, dass die Codegenerierung (die zur Kompilierungszeit aufgerufen wird) korrekt durchgeführt wird
Tags und Links c++ c++11 enum-class