Как работают буст-операторы? - PullRequest
16 голосов
/ 02 июня 2010

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

class MyInt : boost::operators<MyInt>

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

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

1 Ответ

14 голосов
/ 02 июня 2010

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