Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah SFINAE boleh digunakan dengan berkesan dengan fungsi ahli templat kelas?

Bagaimanakah SFINAE boleh digunakan dengan berkesan dengan fungsi ahli templat kelas?

Barbara Streisand
Barbara Streisandasal
2024-11-05 01:21:02968semak imbas

How can SFINAE be used effectively with member functions of class templates?

SFINAE untuk Fungsi Ahli Templat Kelas

Dalam kod yang disediakan, SFINAE digunakan pada fungsi ahli templat kelas. Walau bagaimanapun, pendekatan ini menghadapi ralat kerana SFINAE hanya terpakai untuk hujah templat yang disimpulkan, khususnya untuk templat fungsi.

Dalam kes ini, kelas Foo ialah templat, tetapi kedua-dua bar fungsi ahli () diisyaratkan tanpa syarat tanpa mengira daripada parameter templat T. Ini membawa kepada ralat penyusunan yang menunjukkan bahawa kedua-dua beban lampau tidak boleh kedua-duanya sah.

Untuk menyelesaikan isu ini, SFINAE boleh digunakan dengan betul dengan menyimpulkan hujah templat untuk fungsi ahli. Perubahan berikut boleh dibuat:

<code class="cpp">#include <type_traits>

struct A{};
struct B{};

template <typename T>
struct Foo
{
    template <typename U = T>   // Deduce the template argument
    typename std::enable_if<std::is_same<U, A>::value>::type
    bar() {}

    template <typename U = T>   // Deduce the template argument
    typename std::enable_if<std::is_same<U, B>::value>::type
    bar() {}
};</code>

Dengan menyimpulkan hujah templat untuk fungsi ahli, SFINAE kini boleh menentukan lebihan bar() yang hendak dibuat seketika berdasarkan hujah templat sebenar yang disediakan untuk Foo. Pendekatan ini memastikan bahawa kod akan berjaya disusun dan berfungsi seperti yang dimaksudkan.

Atas ialah kandungan terperinci Bagaimanakah SFINAE boleh digunakan dengan berkesan dengan fungsi ahli 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