boost::operators
基于像+=
这样的手动实现自动定义像+
这样的运算符,这非常有用。要为T
生成这些运算符,需要继承boost::operators<T>
,如boost示例所示:
class MyInt : boost::operators<MyInt>
我熟悉CRTP模式,但我看不出它在这里是如何工作的。具体地说,我并没有真正继承任何工具,因为运算符不是成员。boost::operators
似乎完全是空的,但我不太擅长阅读boost源代码。
有人能详细解释一下这是如何工作的吗?这个机制是否广为人知和广泛使用?
发布于 2010-06-02 21:50:36
有一个很大的多重继承链,在链的顶部有许多实现运算符的类,但它们是作为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; }
};
https://stackoverflow.com/questions/2958142
复制相似问题