Как операторы повышения работают?

boost::operators автоматически определяет операторы как + на основе ручных реализаций как += который очень полезен. Генерировать те операторы для T, каждый наследовался boost::operators<T> как показано примером повышения:

class MyInt : boost::operators<MyInt>

Я знаком с шаблоном CRTP, но мне не удается видеть, как он работает здесь. А именно, я действительно не наследовал средств, так как операторы не являются участниками. boost::operators кажется, абсолютно пуст, но я не очень хорош при чтении исходного кода повышения.

Кто-либо мог объяснить, как это работает подробно? Действительно ли этот механизм известен и широко используется?

17
задан fredoverflow 2 June 2010 в 13:30
поделиться

1 ответ

Существует большая цепочка множественного наследования, в верхней части которой находится ряд классов, реализующих операторы, но выполняющих их как функции 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; }
};
15
ответ дан 30 November 2019 в 14:17
поделиться
Другие вопросы по тегам:

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