Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengekang Jenis Generik dalam C?

Bagaimanakah Saya Boleh Mengekang Jenis Generik dalam C?

Linda Hamilton
Linda Hamiltonasal
2024-12-18 16:28:10987semak imbas

How Can I Constrain Generic Types in C  ?

Mengekang Jenis Generik dalam C

Jenis generik menawarkan keupayaan untuk mencipta kelas atau fungsi yang boleh beroperasi pada pelbagai jenis data. Walau bagaimanapun, dalam beberapa kes, anda mungkin mahu mengehadkan jenis generik untuk menerima jenis tertentu sahaja. Di sinilah konsep mengekang jenis generik dimainkan.

Di Java, anda boleh menggunakan kata kunci extends untuk mengekang kelas generik untuk menerima hanya jenis yang melanjutkan kelas tertentu. C tidak mempunyai persamaan langsung dengan kata kunci ini. Walau bagaimanapun, terdapat beberapa pendekatan yang boleh digunakan untuk mencapai hasil yang serupa.

Pendekatan Menggunakan Ciri Jenis

C 11 memperkenalkan perpustakaan, yang menyediakan pelbagai fungsi berkaitan jenis yang boleh membantu dalam mengekang jenis generik. Sebagai contoh, fungsi std::is_base_of boleh digunakan untuk menguji sama ada jenis tertentu mewarisi daripada kelas tertentu.

#include <type_traits>

template<typename T>
class ObservableList {
    static_assert(std::is_base_of<list, T>::value, "T must inherit from list");
    // code here...
};

Pendekatan ini mengesahkan bahawa jenis T mewarisi daripada senarai sebelum membenarkan penggunaannya dalam ObservableList .

Pendekatan Menggunakan Penaipan Itik

Pendekatan alternatif ialah bergantung pada menaip itik, yang melibatkan pemeriksaan sama ada sesuatu jenis menyediakan kaedah atau fungsi tertentu tanpa semestinya mewarisi daripada kelas asas. Pendekatan ini melibatkan lebih sedikit sekatan tetapi boleh membawa kepada kemungkinan ralat jika jenis tidak mematuhi antara muka yang dijangkakan.

Pendekatan Menggunakan Ciri Tersuai

Pilihan lain ialah menentukan sifat tersuai untuk mengekang jenis. Ciri ialah kelas atau struktur yang menyediakan satu set templat fungsi untuk menguji pelbagai jenis sifat. Dengan mentakrifkan ciri tersuai, anda boleh menentukan keperluan untuk jenis yang boleh digunakan dengan jenis generik anda.

#include <type_traits>

template<typename T>
struct HasConstIterator : std::false_type {};

template<typename T>
struct HasConstIterator<T, Void<typename T::const_iterator>> : std::true_type {};

struct HasBeginEnd {
    template<typename T>
    static std::true_type Test(int);

    template<typename...>
    static std::false_type Test(...);
};

template<typename T>
class ObservableList {
    static_assert(HasConstIterator<T>::value, "Must have a const_iterator typedef");
    static_assert(HasBeginEnd<T>::value, "Must have begin and end member functions");
    // code here...
};

Contoh ini menunjukkan penggunaan ciri tersuai yang dilaksanakan menggunakan teknik pengaturcaraan meta untuk mengekang jenis T untuk memenuhi tertentu. keperluan antara muka.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengekang Jenis Generik dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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