C++ int有运算符吗==

C++ int有运算符吗==,c++,sfinae,C++,Sfinae,我试图检查一个类是否有一个方法操作符==。我在SFINAE中找到了一个解决方案,它在我的班级中运行良好 看起来是这样的: template <typename T> class comparable { typedef char one; typedef long two; template <typename C> static one test( typeof(&C::operator==) ) ; template <

我试图检查一个类是否有一个方法
操作符==
。我在SFINAE中找到了一个解决方案,它在我的班级中运行良好

看起来是这样的:

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) };
};
模板
等级可比
{
类型1;
长两个;
模板静态一次测试(typeof(&C::operator==);
模板静态二次试验(…);
公众:
枚举{value=sizeof(test(0))==sizeof(char)};
};
但是,当我尝试时:

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

std::cout
int
不是类类型,并且没有成员
运算符==
,这是您使用
&C::运算符==
检查的内容。因此,测试结果为“否”。正如其他人正确指出的那样,对于只有非成员
操作符==
的类,您的测试也将是否定的

如何正确检查
运算符==
是否存在已在此处询问:
您的测试不会测试表达式
C==C
是否有效。它测试类
C
是否有
C::operator==
。因为
int
不是类,所以它没有类成员


试着进行测试,例如:测试类型(C()==C())

你的直接方法有缺陷(或不完整),至少有两个基本原因

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


其次,这种方法本身不会检测到
操作符==
作为独立函数实现的类。例如,您的测试将表明
std::string
没有
=
运算符。确实,
std::string
没有这样的成员,但是您可以使用独立的
操作符==
比较
std::string
的相等性。因此,即使
int
在某种程度上是一种类类型,也不意味着它将实现
操作符==
作为成员函数。

如果使用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
}
#包括
#包括
使用名称空间std;
模板
等级可比{
公众:
静态constexpr bool值=false;
};
模板
等级可比{
公众:
静态constexpr布尔值=真;
};
甲级{
公众:
布尔运算符==(常数A&){
返回true;
}
};
B类{
};
int main(){

关于你在编辑之前的问题(三个点的意思),看看这个问题:如果
类C{…};布尔运算符==(常数C&a,常数C&b){…}
?你的代码会说没有运算符==,因为类中没有。@πάντῥεῖ 这并没有告诉他为什么他的方法失败了,所以至少我不会这么做。但我同意,这是一个简单的80代表。我们是奥丁的儿子,必须负责任地使用我们的力量。取得了很好的成绩,祝贺+80(一个10来自我这边)。