型チェックを使用した厳密に型指定された識別子の実装
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 サイトの他の関連記事を参照してください。