助推器如何工作?

fre*_*low 17 c++ boost operator-overloading operators

boost::operators自动定义+基于手动实现的运算符+=,这非常有用.要生成这些运算符T,可以从boost::operators<T>boost示例中继承:

class MyInt : boost::operators<MyInt>

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

任何人都可以解释这是如何工作的细节?这种机制是众所周知并广泛使用的吗?

Joe*_*oeG 15

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

  • 它有一个名字:[Barton-Nackman技巧](http://en.wikipedia.org/wiki/Barton-Nackman_trick). (14认同)
  • 真正有趣的是你从课堂上私下继承而且它有效.这真是一个有趣的伎俩:) (4认同)