2012-06-07 68 views
22

Boost.Optional使用虛擬類型來允許構建未初始化的boost::optional<T>實例。這種類型稱爲none_t,和實例none爲了方便標頭已經被定義,讓我們寫代碼如下所示:boost :: none_t實現的基本原理是什麼?

boost::optional<int> uninitialized(boost::none); 

綜觀none_t的定義,我注意到,它實際上是對應於指針到部件的一些虛設結構一個typedef:

namespace boost { 

namespace detail { struct none_helper{}; } 

typedef int detail::none_helper::*none_t ; 

none_t const none = (static_cast<none_t>(0)) ; 

} // namespace boost 

什麼是使用這樣一個令人費解的typedef在這樣一個簡單的空結構的優點?

namespace boost { 

struct none_t {}; 

none_t const none; 

} // namespace boost 
+1

我剛剛意識到(花了我一段時間......),這正是[Safe-Bool成語](http://www.artima.com/cppsource/safebool.html)的結構。 –

+0

@MatthieuM .:你的意思是你剛剛在2012年6月閱讀了評論Nawaz發佈在你的答案上。 ;) –

+0

沒有,重新發現它自己:/早上很難:/ –

回答

17

啊,我從來沒有想過深入挖掘。

現在none在布爾上下文中的計算結果爲false,其中一個(或多或少顯而易見)的優勢是struct

一個優於另一個「評估爲false」的優點是阻止了指向成員的指針有害地提升爲整型。

所以,我想它提供了一個安全簡潔的方法,使對象的評估結果爲false

編輯:人們應該在這裏認識到(哼...)Safe Bool Idiom的結構。

+0

啊......'boost :: none'確實轉換成'false'。 :D – Nawaz

+0

這很有道理,雖然我沒有真正看到讓'none'轉換爲'false'的意義。恕我直言,它只能給人一種'沒有'是'可選'的錯覺。但也許我忽視了圖書館作者預期的某些角落案例。 –

+2

無論如何,換句話說,它只是遵循[安全布爾成語](http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool)。 – Nawaz

相關問題