Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengehadkan Jenis Templat dalam C Seperti Kata Kunci `extends` Java?
Mengekang Jenis Templat dalam C
Di Java, anda boleh mengehadkan kelas generik untuk hanya menerima jenis yang melanjutkan kelas asas tertentu menggunakan memanjangkan kata kunci. Adakah terdapat kata kunci yang serupa dalam C untuk tujuan ini?
C Setara
C tidak mempunyai setara langsung dengan kata kunci lanjutan Java untuk kekangan templat. Walau bagaimanapun, C 11 menyediakan mekanisme alternatif untuk mencapai kesan yang sama.
C 11 Pendekatan Menggunakan Jenis Ciri
Dalam C 11, anda boleh menggunakan std::is_base_of trait daripada
#include <type_traits> template<typename T> class observable_list { static_assert(std::is_base_of<list, T>::value, "T must inherit from list"); // ... };
Contoh ini mentakrifkan kelas templat observable_list yang hanya menerima jenis yang diwarisi daripada kelas senarai. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa templat yang mengekang secara berlebihan boleh mengehadkan fleksibilitinya dan mungkin tidak sesuai dalam C .
Pendekatan Alternatif: Kekangan Berasaskan Ciri
Pendekatan alternatif melibatkan mencipta ciri tersuai untuk mengekang jenis berdasarkan keperluan khusus. Sebagai contoh, anda mungkin mentakrifkan ciri untuk jenis dengan fungsi ahli atau typedef tertentu:
struct has_const_iterator { template<typename T> static bool test(...) { return false; } }; template<typename T> struct has_const_iterator<T, Void<typename T::const_iterator>> { static bool test(...) { return true; } }; struct has_begin_end { template<typename T> static bool test(...) { return false; } template<typename T, typename Begin, typename End> static auto test(int) -> decltype(std::declval<const T&>().begin(), std::declval<const T&>().end()) { return true; } };
Menggunakan ciri ini, anda boleh mengekang observable_list seperti berikut:
class observable_list { static_assert(has_const_iterator<T>::value, "Must have a const_iterator typedef"); static_assert(has_begin_end<T>::value, "Must have begin and end member functions"); // ... };
Pendekatan ini memberikan lebih banyak fleksibiliti dan maklum balas ralat dengan membenarkan anda menentukan kekangan tertentu berdasarkan keperluan anda.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengehadkan Jenis Templat dalam C Seperti Kata Kunci `extends` Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!