


Mengapa SFINAE Gagal dengan Fungsi Ahli dalam Templat Kelas?
Fungsi Ahli SFINAE dalam Templat Kelas: Penjelasan Terperinci
Dalam dunia C , SFINAE (Kegagalan Penggantian Bukan Satu Ralat) membolehkan pengoptimuman templat dengan menghalang ralat instantiasi semasa penyusunan. Walau bagaimanapun, apabila berurusan dengan fungsi ahli templat kelas, SFINAE boleh bertindak secara tidak dijangka.
Masalah dengan Fungsi Ahli SFINAE
Pertimbangkan kod berikut:
<code class="cpp">template <typename T> struct Foo { typename std::enable_if<std::is_same<T, A>::value>::type bar(); typename std::enable_if<std::is_same<T, B>::value>::type bar(); };</code>
Bertentangan dengan jangkaan, kod ini menghasilkan mesej ralat. SFINAE tidak berfungsi seperti yang dimaksudkan untuk fungsi ahli dalam templat kelas.
SFINAE dan Argumen Templat Deduksi
Inti isu terletak pada pergantungan SFINAE pada hujah templat yang disimpulkan . Ia hanya berfungsi apabila hujah templat disimpulkan daripada panggilan fungsi. Dalam kes fungsi ahli, hujah templat tidak disimpulkan dan sebaliknya diberikan secara eksplisit.
Penyelesaian Menggunakan Argumen Deduced
Untuk menangani isu tersebut, kami boleh mengubah suai kod seperti berikut:
<code class="cpp">template<typename T> struct Foo { template<typename U = T> typename std::enable_if<std::is_same<U,A>::value>::type bar() { } template<typename U = T> typename std::enable_if<std::is_same<U,B>::value>::type bar() { } };</code>
Sekarang, apabila memanggil Foo()(x), pengkompil membuat kesimpulan hujah templat T dan memilih lebihan beban yang betul berdasarkan x. Pendekatan ini membolehkan SFINAE berfungsi seperti yang diharapkan.
Sebagai alternatif: Pengkhususan Templat Kelas Eksplisit
Jika struktur kelas adalah penting dan tidak boleh diubah suai, penyelesaian alternatif melibatkan pengkhususan templat kelas eksplisit:
<code class="cpp">template <typename> struct Foo; template <> struct Foo<A> { void bar() {} }; template <> struct Foo<B> { void bar() {} };</code>
Di sini, pengkompil mengetahui dengan tepat pengkhususan yang hendak dibuat seketika berdasarkan jenis yang disediakan. Ia tidak bergantung pada SFINAE untuk pemilihan pengkhususan.
Atas ialah kandungan terperinci Mengapa SFINAE Gagal dengan Fungsi Ahli dalam Templat Kelas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan?

Gulc: Perpustakaan C dibina dari awal

Langkah Format Fungsi Fungsi C Langkah Penukaran Kes

Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu

Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan?

Penggunaan dan perkongsian frasa yang berbeza

Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap?

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi?
