Cara Mengekang Templat untuk Hanya Menerima Jenis Khusus dalam C
Di Java, kelas generik boleh ditakrifkan untuk menerima hanya jenis yang mewarisi daripada kelas tertentu:
public class ObservableList<T extends List> { /* ... */ }
Ini dicapai menggunakan lanjutan kata kunci.
Setara dalam C
Tidak seperti Java, C tidak mempunyai setara langsung dengan kata kunci lanjutan untuk mengekang templat. Walau bagaimanapun, terdapat cara untuk mencapai kekangan yang sama menggunakan ciri jenis std::is_base_of dalam C 11:
#include <type_traits> template<typename T> class observable_list { static_assert(std::is_base_of<list, T>::value, "T must inherit from list"); // code here.. };
Pendekatan Alternatif
Sementara pendekatan ini berfungsi, ia memisahkan diri daripada prinsip reka bentuk C tipikal. Sebaliknya, mungkin lebih sesuai untuk menggunakan kekangan berasaskan ciri:
#include <type_traits> template<typename T> 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"); // code here... }; template<typename T> struct has_const_iterator : std::false_type {}; template<typename T> struct has_const_iterator<T, Void<typename T::const_iterator>> : std::true_type {}; struct has_begin_end_impl { template<typename T, typename Begin = decltype(std::declval<const T&>().begin()), typename End = decltype(std::declval<const T&>().end())> static std::true_type test(int); template<typename... Args> static std::false_type test(...); }; template<typename T> struct has_begin_end : decltype(has_begin_end_impl::test<T>(0)) {}; using Void = typename void_<>::type; template<typename... Args> struct void_ { using type = void; };
Pendekatan ini mentakrifkan ciri tersuai untuk menyemak keperluan khusus (cth., kewujudan const_iterator, fungsi mula dan tamat). Ia memberikan lebih fleksibiliti dan membenarkan mesej ralat tersuai.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengehadkan Jenis Templat dalam C kepada Warisan atau Fungsi Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!