我正在尝试检查一个类是否有方法operator==.我在这里找到了一个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) };
};
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试:
std::cout << comparable<int>::value << std::endl;
Run Code Online (Sandbox Code Playgroud)
然后它返回false,而我期望它返回true.为什么是这样 ?
Bau*_*gen 19
int不是类型,也没有成员operator==,这是你用你的成员检查的&C::operator==.因此,测试产生"否".正如其他人正确指出的那样,对于只有非成员的类,您的测试也会是负面的operator==.
如何正确检查是否operator==存在存在:
如何检查operator ==是否存在?
AnT*_*AnT 10
由于至少两个基本原因,您的直接方法存在缺陷(或不完整).
首先,您的方法检查类 是否C具有名为的成员operator ==.非类型类型不会通过此测试,因为它们没有任何成员.并且int是非类型的.
其次,这种方法本身不会检测operator ==作为独立函数实现的类.例如,您的测试会说std::string没有==操作员.确实std::string没有这样的成员,但你可以std::string使用独立的比较来比较operator ==.因此,即使int某种方式是类类型,它仍然不意味着它将operator ==作为成员函数实现.