По boost documentation - правильное использование повышающего :: операторов вывести из него:Возможно ли наследовать от boost :: операторов, но все равно использовать его?
class A : boost::operators<A>
{
public:
bool operator < (const A&) const { return false; }
};
Теперь я могу использовать >
и <=
и >=
, потому что все эти операторы могут быть реализованы с помощью <
см фрагмент кода от повышения:
template <class T, class B = operators_detail::empty_base<T> >
struct less_than_comparable1 : B
{
friend bool operator>(const T& x, const T& y) { return y < x; }
friend bool operator<=(const T& x, const T& y) { return !static_cast<bool>(y < x); }
friend bool operator>=(const T& x, const T& y) { return !static_cast<bool>(x < y); }
};
И наконец less_than_comparable1
это один из boost::operators
базового класса.
ПРОБЛЕМА: Но добавление такого наследования не всегда удобно. Например. это наследование означает, что я должен добавить конструктор (ы) для некоторых структур, в противном случае весь старый код, например A{1}
остановки компиляции:
struct A : boost::operators<A>
{
A() = default;
A(int a, int b = 0) : a(a), b(b) {}
int a;
int b;
};
bool operator < (const A&, const A&);
Я попробовал несколько способов: внутренний класс, статические члены boost::operators<A>
но мне кажется, что только наследование работает.
Я принимаю ответ, который показывает способ использования boost :: операторов без наследования.
Я также могу принять ответ, который объясняет, почему это наследование необходимо.
Хорошо, давайте упростить немного этот пример, почему мне нужно наследование в этом самом примере ниже, чтобы получить operator >
от operator <
?
template <typename A>
struct GtOperator
{
friend bool operator > (const A& l, const A& r)
{
return r < l;
}
};
struct A : private GtOperator<A>
{
bool operator < (const A&) const
{
return false;
}
};
int main() {
if (A{} > A{})
{
return -1;
}
}
Ничто другое не работает, например. этот способ не работает:
struct A
{
GtOperator<A> dummy;
bool operator < (const A&) const
{
return false;
}
};
Либо запишите его вручную, либо напишите макрос препроцессора. (Есть только шесть операторов, и вы все равно должны писать 'operator>'. Часто может быть полезно писать 'operator =='. –
@MartinBonner 'boost :: operator' предлагает гораздо больше, чем эти 3. Мне просто нравится знать, как использовать его без наследования, если это возможно. Или знать, почему требуется наследование – PiotrNycz
@jaggedSpire Нет никакого добавления к дочернему классу в boost :: operator. Есть только друзья-операторы, подобные этим из 'less_than_comparable1' - без downcasting. Вот почему я спрашиваю, зачем нужно наследование? – PiotrNycz