Ciri Jenis untuk Mengenalpasti Bekas STL
Dalam C , ciri jenis boleh digunakan untuk menentukan sifat bagi jenis tertentu. Satu keperluan biasa ialah untuk menyemak sama ada jenis mewakili bekas, seperti vektor, set atau peta.
Pelaksanaan Tersuai untuk Vektor
Untuk bermula, mari kita mulakan pertimbangkan untuk mencipta ciri jenis khusus untuk vektor. Walau bagaimanapun, percubaan berikut gagal untuk menyusun:
<code class="cpp">template<class T, typename Enable = void> struct is_vector { static bool const value = false; }; template<class T, class U> struct is_vector<T, typename boost::enable_if<boost::is_same<T, std::vector<U>> >::type> { static bool const value = true; };</code>
Kod ini menjana ralat "parameter templat tidak digunakan dalam pengkhususan separa: U." Ini kerana parameter templat U tidak digunakan dalam pengkhususan separa.
Penyelesaian Berasaskan SFINAE untuk Bekas
Pendekatan yang lebih umum ialah menggunakan Kegagalan Penggantian Bukan Bukan Ralat (SFINAE) untuk mencipta ciri jenis yang berfungsi untuk pelbagai bekas STL. Berikut ialah contoh:
<code class="cpp">template<typename T, typename _ = void> struct is_container : std::false_type {}; template<typename... Ts> struct is_container_helper {}; template<typename T> struct is_container< T, std::conditional_t< false, is_container_helper< typename T::value_type, typename T::size_type, typename T::iterator, typename T::const_iterator, decltype(std::declval<T>().size()), decltype(std::declval<T>().begin()), decltype(std::declval<T>().end()), decltype(std::declval<T>().cbegin()), decltype(std::declval<T>().cend()) >, void > > : public std::true_type {};</code>
Ciri jenis ini menyemak kehadiran ahli penting dan kaedah yang biasa kepada kebanyakan bekas STL. Jika semua ahli ini hadir, is_container
Nota: Untuk memastikan ciri jenis hanya mengenal pasti bekas STL, anda mungkin perlu melaraskan semakan untuk mengesahkan keperluan khusus yang lazim bagi bekas STL.
Atas ialah kandungan terperinci Bagaimanakah SFINAE boleh digunakan untuk mencipta ciri jenis untuk mengenal pasti bekas STL dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!