2010-06-02 7 views
16

boost::operators définit automatiquement les opérateurs comme + basé sur des implémentations manuelles comme += ce qui est très utile. Pour générer ces opérateurs pour T, on hérite de boost::operators<T> comme le montre l'exemple de boost:Comment fonctionnent les opérateurs boost?

class MyInt : boost::operators<MyInt>

Je connais le modèle CRTP, mais je ne vois pas comment cela fonctionne ici. En particulier, je n'hérite pas vraiment des installations puisque les opérateurs ne sont pas membres. boost::operators semble être complètement vide, mais je ne suis pas très bon à lire le code source boost.

Quelqu'un pourrait-il expliquer comment cela fonctionne en détail? Ce mécanisme est-il bien connu et largement utilisé?

Répondre

14

Il existe une grande chaîne d'héritage multiple, au sommet de laquelle plusieurs classes implémentent les opérateurs, mais en tant que fonctions friend, les plaçant ainsi dans l'espace de noms englobant plutôt que comme membres de la classe.

Par exemple, la mise en œuvre finale du operator+ devient:

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

Ce qui est vraiment amusant est que vous héritez privé de la classe et pourtant il fonctionne. C'est un truc marrant vraiment :) –

+13

Il a un nom: le [truc de Barton-Nackman] (http://en.wikipedia.org/wiki/Barton-Nackman_trick). –

Questions connexes