Rumah >pembangunan bahagian belakang >C++ >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!