boost::operators
根据+
之类的手动实现自动定义+=
等运算符,这非常有用。要为T
生成这些运算符,一个继承自boost::operators<T>
,如boost示例所示:
class MyInt : boost::operators<MyInt>
我熟悉CRTP模式,但我没看到它在这里是如何工作的。具体来说,我并没有真正继承任何设施,因为运营商不是会员。 boost::operators
似乎完全是空的,但我不太擅长阅读提升源代码。
有人能解释一下这是如何工作的吗?这种机制是众所周知并广泛使用的吗?
答案 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; }
};