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.
C 11 memperkenalkan
#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 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.
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!