In C ist die Prüfung auf das Vorhandensein einer Mitgliedsfunktion „operator==“ mithilfe der bereitgestellten Funktion unkompliziert Mitgliedsfunktion. Allerdings kann es sich als schwieriger erweisen, das Vorhandensein eines Nichtmitglieds-Operators== zu ermitteln.
C 03-Methode:
Die folgende Technik kann verwendet werden, um zu prüfen, ob Existenz eines beliebigen Operators:
namespace CHECK { class No { bool b[2]; }; template<typename T, typename Arg> No operator== (const T&, const Arg&); bool Check (...); No& Check (const No&); template <typename T, typename Arg = T> struct EqualExists { enum { value = (sizeof(Check(*(T*)(0) == *(Arg*)(0))) != sizeof(No)) }; }; }
Um diese Methode zu verwenden, rufen Sie einfach EqualExists auf Vorlage:
CHECK::EqualExists<A>::value;
Wenn der EqualExists-Wert ungleich Null ist, existiert der Nichtmitgliedsoperator ==.
C 11-Methode:
C 11 bietet einen saubereren Ansatz mit decltype und std::declval:
namespace CHECK { struct No {}; template<typename T, typename Arg> No operator== (const T&, const Arg&); template<typename T, typename Arg = T> struct EqualExists { enum { value = !std::is_same<decltype(std::declval<T>() < std::declval<Arg>()), No>::value }; }; }
Zur Überprüfung der Nicht-Mitgliedsoperator==, verwenden Sie:
CHECK::EqualExists<A>::value;
Das obige ist der detaillierte Inhalt vonWie kann ich die Existenz eines Nicht-Mitglieds „operator==' in C überprüfen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!