gpt4 book ai didi

c++ - 如何检查 operator== 是否存在?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:50:50 28 4
gpt4 key购买 nike

我正在尝试创建一个示例,它将检查 operator==(成员或非成员函数)是否存在。检查一个类是否有成员operator==很容易,但是如何检查它是否有一个非成员operator==呢?

这就是我要做的:

#include <iostream>

struct A
{
int a;

#if 0
bool operator==( const A& rhs ) const
{
return ( a==rhs.a);
}
#endif
};
#if 1
bool operator==( const A &l,const A &r )
{
return ( l.a==r.a);
}
#endif


template < typename T >
struct opEqualExists
{
struct yes{ char a[1]; };
struct no { char a[2]; };

template <typename C> static yes test( typeof(&C::operator==) );
//template <typename C> static yes test( ???? );
template <typename C> static no test(...);

enum { value = (sizeof(test<T>(0)) == sizeof(yes)) };
};

int main()
{
std::cout<<(int)opEqualExists<A>::value<<std::endl;
}

是否可以编写一个测试函数来测试非成员operator==的存在?如果是,如何?

顺便说一句,我已经检查过类似的问题,但还没有找到合适的解决方案:
Is it possible to use SFINAE/templates to check if an operator exists?

这是我试过的:

template <typename C> static yes test( const C*,bool(*)(const C&,constC&) = &operator== );

但如果删除非成员运算符==,编译将失败

最佳答案

C++03

下面的技巧是有效的,它可以用于所有这样的运算符:

namespace CHECK
{
class No { bool b[2]; };
template<typename T, typename Arg> No operator== (const T&, const Arg&);

bool Check (...);
No& Check (const No&);

template <typename T, typename Arg = T>
struct EqualExists
{
enum { value = (sizeof(Check(*(T*)(0) == *(Arg*)(0))) != sizeof(No)) };
};
}

用法:

CHECK::EqualExists<A>::value;

第二个template typename Arg对于一些特殊情况很有用,比如 A::operator==(short) ,它与 class 不相似本身。在这种情况下,用法是:

CHECK::EqualExists<A, short>::value
// ^^^^^ argument of `operator==`

Demo .


C++11

我们不需要使用 sizeof当我们有 decltype 时,还有空引用技巧和 std::declval

namespace CHECK
{
struct No {};
template<typename T, typename Arg> No operator== (const T&, const Arg&);

template<typename T, typename Arg = T>
struct EqualExists
{
enum { value = !std::is_same<decltype(std::declval<T>() < std::declval<Arg>()), No>::value };
};
}

Demo

关于c++ - 如何检查 operator== 是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29234737/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com