Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa SFINAE Tidak Berfungsi dengan Fungsi Ahli Templat Kelas?

Mengapa SFINAE Tidak Berfungsi dengan Fungsi Ahli Templat Kelas?

Barbara Streisand
Barbara Streisandasal
2024-11-04 21:55:02167semak imbas

Why Doesn't SFINAE Work with Member Functions of Class Templates?

Mengapa SFINAE (enable_if) tidak berfungsi untuk fungsi ahli templat kelas?

Dalam C , SFINAE (Kegagalan Penggantian Bukan Ralat) membenarkan anda untuk dayakan atau lumpuhkan kod bergantung pada jenis hujah templat. Walau bagaimanapun, apabila berurusan dengan fungsi ahli templat kelas, SFINAE selalunya tidak berfungsi seperti yang diharapkan.

Berikut ialah contoh yang menunjukkan isu:

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

struct A {};
struct B {};

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>

Dalam contoh ini, Foo mentakrifkan dua bar fungsi ahli terlebih beban(). Lebihan pertama didayakan apabila T ialah A, dan yang kedua didayakan apabila T ialah B. Walau bagaimanapun, jika anda cuba menyusun kod ini, anda akan mendapat mesej ralat yang menunjukkan bahawa lebihan beban tidak dapat diselesaikan.

Sebab ralat ini ialah SFINAE hanya berfungsi untuk deduced argumen templat. Dalam kes fungsi ahli templat kelas, hujah templat tidak disimpulkan tetapi dinyatakan secara eksplisit. Untuk menyelesaikan isu ini, anda boleh menggunakan salah satu daripada teknik berikut:

  • Gunakan hujah templat eksplisit:

    <code class="cpp">struct Foo
    {
      void bar(A) {}
      void bar(B) {}
    };</code>
  • Gunakan std::enable_if di dalam fungsi ahli:

    <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>
  • Gunakan pengkhususan templat kelas eksplisit:

    <code class="cpp">template <> struct Foo<A> { void bar() {} };
    template <> struct Foo<B> { void bar() {} };</code>

Atas ialah kandungan terperinci Mengapa SFINAE Tidak Berfungsi 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