Rumah >pembangunan bahagian belakang >C++ >Mengapa SFINAE Gagal dengan Fungsi Ahli dalam Templat Kelas?

Mengapa SFINAE Gagal dengan Fungsi Ahli dalam Templat Kelas?

Patricia Arquette
Patricia Arquetteasal
2024-11-05 04:26:02369semak imbas

Why Does SFINAE Fail with Member Functions in Class Templates?

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!

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