ホームページ >バックエンド開発 >C++ >C で非メンバー `operator==` の存在を確認するにはどうすればよいですか?

C で非メンバー `operator==` の存在を確認するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-02 16:50:11814ブラウズ

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

C での非メンバー Operator== の存在の確認

C では、メンバー関数 Operator== の存在の確認は、提供されているメソッドを使用することで簡単に行えます。メンバー関数。ただし、非メンバー演算子 == の存在を判断するのはさらに難しいことが判明する可能性があります。

C 03 メソッド:

次の手法を使用して、演算子の存在:

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)) };
  };  
}

このメソッドを使用するには、単に EqualExists を呼び出します。テンプレート:

CHECK::EqualExists<A>::value;

EqualExists 値が 0 以外の場合、非メンバーの演算子 == が存在します。

C 11 メソッド:

C 11 は、decltype と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 };
  };  
}

非メンバー演算子==を確認するには、次を使用します:

CHECK::EqualExists<A>::value;

以上がC で非メンバー `operator==` の存在を確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。