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

Mengapa SFINAE Tidak Berfungsi dengan Fungsi Ahli Templat Kelas?

Barbara Streisand
Lepaskan: 2024-11-04 21:55:02
asal
249 orang telah melayarinya

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>
Salin selepas log masuk

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>
    Salin selepas log masuk
  • 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>
    Salin selepas log masuk
  • Gunakan pengkhususan templat kelas eksplisit:

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

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan