Pelaksanaan Pengecam Ditaip Kuat dengan Semakan Jenis
Dalam C 17, anda boleh melaksanakan pengecam ditaip kuat menggunakan kelas tersuai yang mewarisi daripada yang dimaksudkan jenis asas. Ini membenarkan pemeriksaan jenis semasa penyusunan, menghalang penetapan nilai yang tidak serasi.
Pertimbangkan kod berikut:
#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... }
Dalam kod ini, string_id ialah kelas templat yang diwarisi daripada std:: rentetan. Ia menyediakan kaedah value() untuk mengakses nilai rentetan asas. Jenis yang berbeza digunakan sebagai teg untuk mencipta pengecam unik (cth., portal_tag dan cake_tag).
Menggunakan pendekatan ini, tugasan antara pengecam jenis yang berbeza dihalang oleh pengkompil. Selain itu, ia menyokong operasi standard seperti perbandingan dan pencincangan, membolehkan penyepaduan yang lancar dengan bekas seperti peta.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Pengecam Ditaip Kuat dengan Semakan Jenis dalam C 17?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!