助推操作员如何工作?

助推操作员如何工作?

问题描述:

boost::operators自动定义的运营商像+基于手动实施,如+=这非常有用。为了产生这些运营商T,一个来自boost::operators<T>继承如图所示由升压例如:助推操作员如何工作?

class MyInt : boost::operators<MyInt>

我熟悉了CRTP模式,但我看不出它是如何工作在这里。具体而言,由于运营商不是会员,我并没有真正继承任何设施。 boost::operators似乎完全是空的,但我不太擅长阅读提升源代码。

任何人都可以解释这是如何工作的细节?这种机制是否广为人知和广泛使用?

有一个很大的多重继承链,其顶部有许多类来实现这些运算符,但是这样做的功能就是将它们放在封闭的名称空间中,而不是作为类的成员。

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

什么是真正有趣的是,你从类私有继承,但它的工作原理。这真是一个有趣的技巧:) – 2010-06-02 15:40:37

+13

它有一个名字:[Barton-Nackman trick](http://en.wikipedia.org/wiki/Barton-Nackman_trick)。 – 2010-06-02 17:32:27