Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah ciri taip membezakan antara bekas STL seperti vektor, set dan peta? Bagaimanakah anda boleh mencipta ciri jenis khusus untuk vektor?

Bolehkah ciri taip membezakan antara bekas STL seperti vektor, set dan peta? Bagaimanakah anda boleh mencipta ciri jenis khusus untuk vektor?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-27 04:58:03614semak imbas

 Can type traits differentiate between STL containers like vectors, sets, and maps? How can you create a type trait specifically for vectors?

Type Trait Detection: Crafting is_container or is_vector

Dalam alam C , jenis trait menyediakan mekanisme yang berkuasa untuk pengaturcaraan bersyarat dan penyusunan- refleksi masa. Satu kes penggunaan biasa adalah untuk mencipta ciri jenis yang membezakan antara jenis bekas yang berbeza.

Soalan:

Adakah mungkin untuk mencipta ciri jenis yang menilai kepada benar untuk semua bekas STL biasa, seperti vektor, set dan peta? Selain itu, bagaimanakah kita boleh mentakrifkan ciri jenis yang benar untuk vektor secara khusus?

Jawapan:

Mengesan Bekas STL menggunakan SFINAE:

Untuk mencapai matlamat ini, kami boleh menggunakan SFINAE (Kegagalan Penggantian Bukan Ralat) untuk menyemak fungsi dan jenis ahli tertentu yang menjadi ciri 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>

Tit jenis ini menyemak kewujudan fungsi ahli biasa dan jenis yang dikaitkan dengan bekas STL, seperti saiz(), mula(), dan akhir().

Mengesan Vektor:

Untuk ciri jenis yang lebih khusus, anda boleh menyemak kehadiran fungsi dan jenis ahli tambahan yang unik kepada vektor. Contohnya:

<code class="cpp">template<typename T, typename Enable = void>
struct is_vector {
  static bool const value = false;
};

template<typename T>
struct is_vector<T, typename std::enable_if<std::is_same<T, std::vector<__>>::value>::type> {
  static bool const value = true;
};</code>

Tit jenis ini menggunakan std::is_same untuk menyemak sama ada parameter templat T secara khusus std::vector.

Kesimpulan:

Dengan memanfaatkan SFINAE dan pengkhususan templat bersyarat, anda boleh mencipta ciri jenis yang membezakan dengan tepat antara jenis bekas yang berbeza, memberikan maklumat masa kompilasi yang berharga untuk pengaturcaraan bersyarat dan tugasan kejuruteraan perisian.

Atas ialah kandungan terperinci Bolehkah ciri taip membezakan antara bekas STL seperti vektor, set dan peta? Bagaimanakah anda boleh mencipta ciri jenis khusus untuk vektor?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn