Я пытаюсь создать пример, который проверял бы существование оператора ==
( член или функция, не являющаяся членом). Проверить, есть ли у класса член 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== );
но компиляция завершается неудачно, если удален оператор ==, не являющийся членом
я предполагаю, что Вы хотите проверить, обеспечивает ли пользователь, Шаблонный тип имеет оператор равенства или нет, если это так, Понятия здесь для помощи.
#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
и т.д. Взгляните здесь