通过类型检查实现强类型标识符
在 C 17 中,您可以使用继承自预期的自定义类来实现强类型标识符基础类型。这允许在编译期间进行类型检查,防止分配不兼容的值。
考虑以下代码:
#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... }
在此代码中,string_id 是一个继承自 std: 的模板类:细绳。它提供了 value() 方法来访问底层字符串值。不同类型用作标签来创建唯一标识符(例如,portal_tag 和 cake_tag)。
使用这种方法,编译器可以防止不同类型标识符之间的分配。此外,它还支持比较和散列等标准操作,允许与地图等容器无缝集成。
以上是如何在 C 17 中通过类型检查实现强类型标识符?的详细内容。更多信息请关注PHP中文网其他相关文章!