Wie wird eine Umwandlung von Enumeration zu Typ (und wie in einer Vorlage) in C ++ durchgeführt?

8

Dies ist etwas, das in C # möglich ist (siehe Wie enum in den Typ ), aber ich frage mich, wie ich es in C ++ 11 implementieren sollte?

Ein mögliches Code-Skelett (das auch meine beabsichtigte Verwendung zeigt) wäre:

%Vor%

_

%Vor%

Einige Erläuterungen basierend auf den Kommentaren: 1) classify.h ist Teil einer öffentlichen API (für Dritte / andere Firmen), daher kann der Typ zur Kompilierzeit nicht bekannt sein. Dennoch ist es kein Problem, die Vorlage für alle Typen in ELowledTypes zu kompilieren. Die ELowledTypes sind hauptsächlich für Kommunikationszwecke mit dem Client und um zukünftige Änderungen an den internen Datentypen zu erlauben (ohne die öffentliche API zu ändern), so dass es keine Garantie für ein Eins-zu-Eins-Mapping gibt. 2) Entity ist keine Basisklasse von A, B, BC usw. Es ist nur ein generisches Objekt, mit dem wir eine Klassifizierung A, B oder C assoziieren wollen. Die Implementierungsdetails wie A, B usw. ist angehängt sollte versteckt bleiben.

    
mr_T 03.10.2016, 09:14
quelle

3 Antworten

4

Sie könnten Folgendes tun:

%Vor%

Dazu müssten Sie jedes Mal, wenn Sie eine neue mögliche Klasse hinzufügen möchten, ein neues cl<eX, X> hinzufügen. Dies ist im Grunde ein "rekursives" switch , das vom Compiler wahrscheinlich als einfacher switch 1 optimiert wird. Die Idee hier ist, die enum -Werte mit ihren Klassen zu verknüpfen, indem Sie die cl -Strukturen verwenden.

Wenn Sie die Liste von cl außerhalb speichern möchten, können Sie Folgendes tun:

%Vor%

Und dann müssten Sie nur die Definition von enumToType ändern (ich verwende std::tuple hier, aber Sie könnten eine benutzerdefinierte Struktur haben, die nur Typen hält).

1 Dieser Code entspricht im Wesentlichen:

%Vor%

    
Holt 03.10.2016 11:44
quelle
3

Es gibt keine Möglichkeit, es direkt so zu machen, wie Sie es wünschen, da c ++ nicht einen Reflexionsmechanismus unterstützt, und ich denke nicht, dass es sich zumindest für eine Weile ändern wird ... Aber ... Wenn Sie wissen, welche Typen von Ihrem Klassifikator unterstützt werden sollen, können Sie den folgenden Code für Ihr Anwendungsfall-Szenario anpassen:

%Vor%

Ausgabe:

  

A :: run () aufgerufen

    
W.F. 03.10.2016 10:56
quelle
3

Lass einfach die Aufzählung fallen. Enums stehen für Nummer. Typen sind Typen. Warum die zwei mischen? Sie können das gleiche nur mit Typen und Vorlagen tun!

Lassen Sie uns zunächst Ihre enum des erlaubten Typs in eine Liste von Typ ändern, die wahrscheinlich viel besser zu Ihrem Problem passt:

%Vor%

Danach senden wir Ihrer Funktion classifyEntityAs eine Zahl, indem wir ihr einen Typ senden:

%Vor%

Nun ist es ziemlich einfach, den Typ zur Klassifikationsfunktion zu senden:

%Vor%

Wenn Sie den Typ beschränken möchten, den Sie an die Funktion senden können, benötigen wir eine -Meta-Programmierung , die darin besteht, Typen zu vergleichen, um zu prüfen, ob ein Typ T vom Typ ist Liste.

%Vor%

Okay, jetzt ist der schwierige Teil erledigt. Wir können Ihre Funktion mit dem neuen Typmerkmal einschränken:

%Vor%

Wenn Sie Ihre Funktion aufrufen, sind nur Typen von AllowedTypes erlaubt.

Sie können ein Live-Beispiel auf Coliru

überprüfen     
Guillaume Racicot 03.10.2016 13:14
quelle

Tags und Links