助推器如何工作?

时间:2010-06-02 13:30:20

标签: c++ boost operators operator-overloading

boost::operators根据+之类的手动实现自动定义+=等运算符,这非常有用。要为T生成这些运算符,一个继承自boost::operators<T>,如boost示例所示:

class MyInt : boost::operators<MyInt>

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

有人能解释一下这是如何工作的吗?这种机制是众所周知并广泛使用的吗?

1 个答案:

答案 0 :(得分:14)

有一个很大的多重继承链,其顶部有许多实现运算符的类,但是作为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; }
};