2010-06-02 83 views
16

boost::operators自動定義的運營商像+基於手動實施,如+=這非常有用。爲了產生這些運營商T,一個來自boost::operators<T>繼承如圖所示由升壓例如:助推操作員如何工作?

class MyInt : boost::operators<MyInt>

我熟悉了CRTP模式,但我看不出它是如何工作在這裏。具體而言,由於運營商不是會員,我並沒有真正繼承任何設施。 boost::operators似乎完全是空的,但我不太擅長閱讀提升源代碼。

任何人都可以解釋這是如何工作的細節?這種機制是否廣爲人知和廣泛使用?

回答

14

有一個很大的多重繼承鏈,其頂部有許多類來實現這些運算符,但是這樣做的功能就是將它們放在封閉的名稱空間中,而不是作爲類的成員。

例如,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; } 
}; 
+4

什麼是真正有趣的是,你從類私有繼承,但它的工作原理。這真是一個有趣的技巧:) – 2010-06-02 15:40:37

+13

它有一個名字:[Barton-Nackman trick](http://en.wikipedia.org/wiki/Barton-Nackman_trick)。 – 2010-06-02 17:32:27