2010-06-02 14 views
16

boost::operators define automáticamente operadores como + basado en implementaciones manuales como += que es muy útil. Para generar los operadores de T, uno hereda de boost::operators<T> como se muestra en el ejemplo impulso:¿Cómo funcionan los operadores de impulso?

class MyInt : boost::operators<MyInt>

estoy familiarizado con el patrón CRTP, pero no puedo ver cómo se trabaja aquí. Específicamente, realmente no estoy heredando ninguna instalación ya que los operadores no son miembros. boost::operators parece estar completamente vacío, pero no soy muy bueno para leer el código fuente de impulso.

¿Alguien podría explicar cómo funciona esto en detalle? ¿Es este mecanismo bien conocido y ampliamente utilizado?

Respuesta

14

Hay una gran cadena de herencia múltiple, en la parte superior hay una serie de clases que implementan los operadores, pero lo hacen como friend funciones, colocándolas en el espacio de nombres adjunto en lugar de como miembros de la clase.

Por ejemplo, la aplicación definitiva de operator+ se convierte en:

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

Lo que es realmente divertido es que se hereda de forma privada de la clase y sin embargo funciona. Realmente es un truco divertido :) –

+13

Tiene un nombre: el truco [Barton-Nackman] (http://en.wikipedia.org/wiki/Barton-Nackman_trick). –