int 有运算符吗==

does int have an operator==

我正在尝试检查 class 是否有方法 operator==。我用 SFINAE here 找到了一个解决方案,它在我制作的 class 上运行良好。

看起来像这样:

template <typename T>
class comparable
{
    typedef char one;
    typedef long two;

    template <typename C> static one test( typeof(&C::operator==) ) ;
    template <typename C> static two test(...);


public:
    enum { value = sizeof(test<T>(0)) == sizeof(char) };
};

但是,当我尝试时:

std::cout << comparable<int>::value << std::endl;

然后它 return 是错误的,而我期望它是 return 正确的。这是为什么?

int 不是 class 类型并且没有成员 operator==,这是您使用 &C::operator== 检查的内容。因此,测试产生 "no"。正如其他人正确指出的那样,您的测试对于 classes 也将是负面的,只有一个非成员 operator==

如何正确检查 operator== 是否存在已在此处询问: How to check whether operator== exists?

您的测试不会测试表达式 C==C 是否有效。它测试您的 class C 是否有 C::operator==。因为 int 不是 class 它没有 class-成员。

尝试测试,例如typeof(C()==C())

至少出于两个根本原因,您的直接方法存在缺陷(或不完整)。

首先,您的方法检查 class C 是否有名为 operator == 成员 .非 class 类型将无法通过此测试,因为它们没有任何成员。而 int 是非 class 类型。

其次,这种方法本身不会检测 classes,其中 operator == 是作为独立函数实现的。例如,您的测试会说 std::string 没有 == 运算符。 std::string 确实没有这样的成员,但是您可以使用独立的 operator == 比较 std::string 的相等性。所以,即使 int 不知何故是一个 class 类型,它仍然不意味着它会实现 operator == 作为成员函数。

如果你使用 c++11,你可以使用 decltype,这将使实现更容易:

#include <iostream>
#include <type_traits>

using namespace std;

template <class T, class Sfinae = void>
class comparable {
public:
   static constexpr bool value = false;
};

template <class T>
class comparable <T, typename enable_if<is_same<decltype(declval<T>() == declval<T>()), bool>::value>::type> {
public:
   static constexpr bool value = true;
};

class A {
public:
   bool operator==(const A &) {
      return true;
   }
};

class B {
};

int main() {
   cout << comparable<int>::value << endl; // output: 1
   cout << comparable<A>::value << endl; // output: 1
   cout << comparable<B>::value << endl; // output: 0
}