Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Semak Kewujudan `operator==` Bukan Ahli dalam C ?

Bagaimanakah Saya Boleh Semak Kewujudan `operator==` Bukan Ahli dalam C ?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-02 16:50:11814semak imbas

How Can I Check for the Existence of a Non-Member `operator==` in C  ?

Menyemak Kewujudan Operator Bukan Ahli== dalam C

Dalam C , menyemak kewujudan operator fungsi ahli== adalah mudah menggunakan yang disediakan fungsi ahli. Walau bagaimanapun, menentukan kehadiran pengendali bukan ahli== boleh membuktikan lebih mencabar.

C 03 Kaedah:

Teknik berikut boleh digunakan untuk menyemak kewujudan mana-mana pengendali:

namespace CHECK
{
  class No { bool b[2]; };
  template<typename T, typename Arg> No operator== (const T&amp;, const Arg&amp;);

  bool Check (...);
  No&amp; Check (const No&amp;);

  template <typename T, typename Arg = T>
  struct EqualExists
  {
    enum { value = (sizeof(Check(*(T*)(0) == *(Arg*)(0))) != sizeof(No)) };
  };  
}

Untuk menggunakan kaedah ini, hanya gunakan EqualExists templat:

CHECK::EqualExists<A>::value;

Jika nilai EqualExists bukan sifar, operator bukan ahli== wujud.

C 11 Kaedah:

C 11 menyediakan pendekatan yang lebih bersih menggunakan decltype dan std::declval:

namespace CHECK
{
  struct No {}; 
  template<typename T, typename Arg> No operator== (const T&amp;, const Arg&amp;);

  template<typename T, typename Arg = T>
  struct EqualExists
  {
    enum { value = !std::is_same<decltype(std::declval<T>() < std::declval<Arg>()), No>::value };
  };  
}

Untuk menyemak pengendali bukan ahli==, gunakan:

CHECK::EqualExists<A>::value;

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Semak Kewujudan `operator==` Bukan Ahli dalam C ?. 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