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::coutint
不是类类型,并且没有成员运算符==
,这是您使用&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来自我这边)。