Implementierung stark typisierter Bezeichner mit Typprüfung
In C 17 können Sie stark typisierte Bezeichner mithilfe benutzerdefinierter Klassen implementieren, die von den beabsichtigten erben Basistyp. Dies ermöglicht eine Typprüfung während der Kompilierung und verhindert die Zuweisung inkompatibler Werte.
Bedenken Sie den folgenden Code:
#include <iostream> #include <string> #include <map> struct portal_tag {}; struct cake_tag {}; template<class Tag> struct string_id : public std::string { string_id(std::string s) : _value(std::move(s)) {} const std::string& value() const { return _value; } private: std::string _value; }; // Type aliases for convenience using PortalId = string_id<portal_tag>; using CakeId = string_id<cake_tag>; int main() { PortalId portal_id("2"); CakeId cake_id("is a lie"); std::map<CakeId, PortalId> p_to_cake; // OK p_to_cake[cake_id] = portal_id; // OK // p_to_cake[portal_id] = cake_id; // Compile error // portal_id = cake_id; // Compile error // portal_id = "1.0"; // Compile error portal_id = PortalId("42"); // OK // ... Additional operations... }
In diesem Code ist string_id eine Vorlagenklasse, die von std erbt: Zeichenfolge. Es stellt eine value()-Methode bereit, um auf den zugrunde liegenden String-Wert zuzugreifen. Als Tags werden verschiedene Typen verwendet, um eindeutige Bezeichner zu erstellen (z. B. portal_tag und cake_tag).
Mit diesem Ansatz werden Zuweisungen zwischen Bezeichnern verschiedener Typen durch den Compiler verhindert. Darüber hinaus unterstützt es Standardoperationen wie Vergleich und Hashing und ermöglicht so eine nahtlose Integration mit Containern wie Karten.
Das obige ist der detaillierte Inhalt vonWie kann ich stark typisierte Bezeichner mit Typprüfung in C 17 implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!