ホームページ >バックエンド開発 >C++ >C 17 で型チェックを使用して厳密に型指定された識別子を実装するにはどうすればよいですか?

C 17 で型チェックを使用して厳密に型指定された識別子を実装するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-16 08:23:021053ブラウズ

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。