Подтвердить что ты не робот

Как работают ускорители?

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

class MyInt : boost::operators<MyInt>

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

Может ли кто-нибудь объяснить, как это работает в деталях? Является ли этот механизм общеизвестным и широко используемым?

4b9b3361

Ответ 1

Существует большая цепочка множественных наследований, в верхней части которой есть несколько классов, которые реализуют операторы, но делают это как функции friend, тем самым помещая их в охватываемое пространство имен, а не как члены класса.

Например, окончательная реализация operator+ становится:

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; }
};