2012-06-07 2 views
22

Boost.Optional использует фиктивный тип, позволяющий создавать неинициализированные экземпляры boost::optional<T>. Этот тип называется none_t, а экземпляр none уже определен в заголовке для удобства, что позволяет нам писать код, такой как:Какое обоснование для внедрения boost :: none_t?

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

Глядя на определение none_t, я заметил, что это на самом деле ЬурейиЙ соответствующий указатель на член в некоторую фиктивную структуру:

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 

Каковы преимущества использования такого замысловатый ЬурейеГо над простой пустой структурой, как это?

namespace boost { 

struct none_t {}; 

none_t const none; 

} // namespace boost 
+1

Я только что осознал (взял меня на время ...), что это именно структура [Идиомы Safe-Bool] (http://www.artima.com/cppsource/safebool.html). –

+0

@MatthieuM .: Вы имеете в виду, что вы только что прочитали комментарий Nawaz отправили на ваш ответ в июне 2012 года ..? ;) –

+0

Нет, заново открыл его самостоятельно:/Утром сложно:/ –

ответ

17

Ах, я никогда не думал копать глубже.

Одно (более или менее очевидное) преимущество для обычного struct, заключается в том, что сейчас none оценивает false в булевых контекстах.

Одно преимущество над другим «оценивается как ложное» заключается в том, что указатель на элемент предотвращается от вредоносного продвижения до целочисленных типов.

Итак, я предполагаю, что он предлагает безопасный и сжатый способ иметь объект, который оценивается до false.

EDIT: Следует признать здесь (гул ...) структуру Safe Bool Idiom.

+0

А ... 'boost :: none' действительно преобразуется в' false'. : D – Nawaz

+0

Это имеет смысл, хотя я действительно не вижу смысла в создании 'none' конвертируемых в' false'. ИМХО, он может только дать ложное впечатление, что 'none' является« необязательным ». Но, возможно, я упускаю из виду некоторые угловые случаи, ожидаемые авторами библиотеки. –

+2

В любом случае, это просто следует [Safe Bool Idiom] (http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool). – Nawaz