Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah SFINAE boleh digunakan untuk mencipta ciri jenis untuk mengenal pasti bekas STL dalam C ?

Bagaimanakah SFINAE boleh digunakan untuk mencipta ciri jenis untuk mengenal pasti bekas STL dalam C ?

Barbara Streisand
Barbara Streisandasal
2024-10-26 12:00:29201semak imbas

How can SFINAE be used to create a type trait for identifying STL containers in C  ?

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 menilai kepada benar; jika tidak, ia menilai kepada palsu.

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!

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