首页  >  文章  >  后端开发  >  如何在 C 17 中通过类型检查实现强类型标识符?

如何在 C 17 中通过类型检查实现强类型标识符?

Linda Hamilton
Linda Hamilton原创
2024-11-16 08:23:02958浏览

How Can I Implement Strongly Typed Identifiers with Type Checking in C  17?

通过类型检查实现强类型标识符

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn