boost::operators
автоматически определяет операторы как +
на основе ручных реализаций как +=
который очень полезен. Генерировать те операторы для T
, каждый наследовался boost::operators<T>
как показано примером повышения:
class MyInt : boost::operators<MyInt>
Я знаком с шаблоном CRTP, но мне не удается видеть, как он работает здесь. А именно, я действительно не наследовал средств, так как операторы не являются участниками. boost::operators
кажется, абсолютно пуст, но я не очень хорош при чтении исходного кода повышения.
Кто-либо мог объяснить, как это работает подробно? Действительно ли этот механизм известен и широко используется?
Существует большая цепочка множественного наследования, в верхней части которой находится ряд классов, реализующих операторы, но выполняющих их как функции friend
, таким образом помещая их в охватывающее пространство имен, а не как члены класса.
Например, окончательная реализация оператора +
будет выглядеть так:
template <class T, class U, class B = ::boost::detail::empty_base<T> >
struct addable2 : B
{
friend T operator +( T lhs, const U& rhs ) { return lhs += rhs; }
friend T operator +( const U& lhs, T rhs ) { return rhs += lhs; }
};