int有一个运算符==

Mal*_*olm 12 c++ sfinae

我正在尝试检查一个类是否有方法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 ==是否存在?

  • Dupe其实?? (3认同)

AnT*_*AnT 10

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

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

其次,这种方法本身不会检测operator ==作为独立函数实现的类.例如,您的测试会说std::string没有==操作员.确实std::string没有这样的成员,但你可以std::string使用独立的比较来比较operator ==.因此,即使int某种方式是类类型,它仍然不意味着它将operator ==作为成员函数实现.