Implémentation d'identifiants fortement typés avec vérification de type
En C 17, vous pouvez implémenter des identifiants fortement typés à l'aide de classes personnalisées qui héritent de l'objet prévu type de base. Cela permet la vérification du type lors de la compilation, empêchant l'affectation de valeurs incompatibles.
Considérez le code suivant :
#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... }
Dans ce code, string_id est une classe de modèle qui hérite de std : chaîne. Il fournit une méthode value() pour accéder à la valeur de chaîne sous-jacente. Différents types sont utilisés comme balises pour créer des identifiants uniques (par exemple, portal_tag et cake_tag).
Grâce à cette approche, les affectations entre identifiants de différents types sont empêchées par le compilateur. De plus, il prend en charge les opérations standard telles que la comparaison et le hachage, permettant une intégration transparente avec des conteneurs tels que des cartes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!