Как проверить, существует ли оператор ==?

Я пытаюсь создать пример, который проверял бы существование оператора == ( член или функция, не являющаяся членом). Проверить, есть ли у класса член operator == , легко, но как проверить, есть ли у него не-member operator == ?

Это то, что у меня есть до сих пор:

#include 

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  static yes test( typeof(&C::operator==) );
    //template  static yes test( ???? );
    template  static no test(...);

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

int main()
{
    std::cout<<(int)opEqualExists::value<

Можно ли написать тестовую функцию для проверки существования не-member operator == ? Если да, то как?

Кстати, я проверил похожие вопросы, но не нашел подходящего решения:
Можно ли использовать SFINAE / templates, чтобы проверить, существует ли оператор?

Это то, что я пробовал :

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

но компиляция завершается неудачно, если удален оператор ==, не являющийся членом

48
задан Community 23 May 2017 в 02:10
поделиться

1 ответ

C++ 20

я предполагаю, что Вы хотите проверить, обеспечивает ли пользователь, Шаблонный тип имеет оператор равенства или нет, если это так, Понятия здесь для помощи.

#include<concepts>

struct S{
   int x;
};

template<class T>
requires std::EqualityComparable<T>
void do_magic(T a, T b){
    return a == b;
}

int main(){
    // do_magic(S{}, S{}); Compile time error
    do_magic(56, 46); // Okay int has == and !=

return 0;
}
<час>

, Если Вы передаете какой-либо тип, который не имеет == и !=, перегружают компилятор просто ошибки с сообщением:

EqualityComparable понятие, не удовлетворенное тип

<час>

, можно также использовать std::EqualityComparableWith<T, U>, понятие может проверить на тех, перегружаются между двумя различными типами.

существует намного больше понятий, которые были добавлены к стандартам как Incrementable и т.д. Взгляните здесь

1
ответ дан 7 November 2019 в 12:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: