助推操作员如何工作?
问题描述:
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; }
};
什么是真正有趣的是,你从类私有继承,但它的工作原理。这真是一个有趣的技巧:) – 2010-06-02 15:40:37
它有一个名字:[Barton-Nackman trick](http://en.wikipedia.org/wiki/Barton-Nackman_trick)。 – 2010-06-02 17:32:27