Maison >développement back-end >C++ >Comment puis-je vérifier l'existence d'un `operator==` non membre en C ?

Comment puis-je vérifier l'existence d'un `operator==` non membre en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-02 16:50:11807parcourir

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

Vérification de l'existence d'un Operator== non membre en C

En C, vérifier l'existence d'une fonction membre Operator== est simple en utilisant le fonction membre. Cependant, déterminer la présence d'un opérateur non membre == peut s'avérer plus difficile.

Méthode C 03 :

La technique suivante peut être utilisée pour vérifier la existence de tout opérateur :

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

Pour utiliser cette méthode, invoquez simplement l'EqualExists modèle :

CHECK::EqualExists<A>::value;

Si la valeur EqualExists est différente de zéro, l'opérateur non membre == existe.

Méthode C 11 :

C 11 fournit une approche plus propre en utilisant decltype et 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 };
  };  
}

Pour vérifier l'opérateur non membre ==, utilisez :

CHECK::EqualExists<A>::value;

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn