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
}
我正在尝试检查 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
}