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

Mary-Kate Olsen
Lepaskan: 2024-10-27 04:58:03
asal
612 orang telah melayarinya

 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!