Mengekang Templat dalam C
Di Java, templat boleh dikekang untuk menerima jenis yang diwarisi daripada kelas tertentu menggunakan kata kunci "extends" . Adakah terdapat mekanisme yang setanding dalam C ?
Mengekang dengan Kelas Asas dalam C
Tidak seperti di Jawa, mengekang templat berdasarkan warisan semata-mata tidak digalakkan dalam C . Ini boleh menyekat fleksibiliti dan menghalang pengguna daripada menggunakan jenis alternatif yang memenuhi antara muka yang dimaksudkan.
Alternatif C 11: Ciri Jenis
Menggunakan ciri C 11, anda boleh mentakrifkan templat yang menegaskan kekangan berdasarkan sama ada jenis mewarisi daripada yang tertentu kelas:
#include <type_traits> template<typename T> class observable_list { static_assert(std::is_base_of<list, T>::value, "T must inherit from list"); // ... };
Walau bagaimanapun, pendekatan ini menyimpang daripada amalan C biasa dan boleh membawa kepada pengehadan.
Penyelesaian Alternatif
Daripada bergantung pada kekangan berasaskan warisan, adalah perkara biasa dalam C untuk menggunakan ciri untuk menentukan antara muka. Ini membolehkan anda mengekang templat berdasarkan sama ada jenis menyediakan fungsi ahli atau typedef tertentu, tanpa mengira warisannya:
#include <type_traits> template<typename T> class observable_list { static_assert(has_const_iterator<T>::value, "T must have a const_iterator typedef"); static_assert(has_begin_end<T>::value, "T must have begin and end member functions"); // ... };
Taip Itik
Dalam beberapa kes, anda boleh bergantung pada "penaipan itik" dengan menentukan templat yang menerima sebarang jenis yang menyediakan fungsi yang diingini. Walaupun pendekatan ini boleh menjadi mudah, ia juga boleh menyebabkan peningkatan ralat dan mengurangkan kebolehbacaan.
Kesimpulan
Mengekang templat dalam C biasanya dilakukan melalui ciri jenis atau definisi antara muka dan bukannya warisan, menawarkan lebih fleksibiliti dan ekspresif dalam reka bentuk templat.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengekang Templat C Tanpa Bergantung pada Warisan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!