Bagaimanakah Saya Boleh Melaksanakan Pengecam Ditaip Kuat dengan Semakan Jenis dalam C 17?

Linda Hamilton
Lepaskan: 2024-11-16 08:23:02
asal
955 orang telah melayarinya

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

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...
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan