validate integer ist ein Enum-Klassenelement (C ++ 11)

8

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ß

    
lurscher 22.11.2011, 03:49
quelle

3 Antworten

2

Eine Lösung für dieses Problem besteht darin, die Enums zu entfernen und sie durch einige Arrays zu ersetzen, die mit XMACROs erstellt wurden.

    
EvilTeach 27.11.2011 16:16
quelle
0

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.

    
Nicol Bolas 22.11.2011 03:56
quelle
0

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

hinzugefügt %Vor%

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

    
lurscher 27.11.2011 16:11
quelle

Tags und Links