2012-01-22 3 views
38

Как я могу «сбросить»/«unset» a boost::optional?Как установить boost :: необязательный возврат в неинициализированное состояние?

optional<int> x; 

if(x) 
{ 
    // We won't hit this since x is uninitialized 
} 
x = 3; 
if(x) 
{ 
    // Now we will hit this since x has been initialized 
} 
// What should I do here to bring x back to uninitialized state? 
if(x) 
{ 
    // I don't want to hit this 
} 
+1

Это немного для меня загадка, почему нет 'опциональный :: clear' или' опциональный :: empty'. – pmr

+1

Наверное, потому что там совершенно не обязательно быть одним. –

+1

@LightnessRacesinOrbit: Можете ли вы уточнить? Я рассматриваю это в контексте необязательных переменных-членов, где вы хотите по существу сбросить часть состояния объекта. Возможно, есть лучший способ сделать это. –

ответ

76
x = boost::none; 

+3

[править] _ (Вот почему у вас «было», чтобы уклониться от минимального ограничения на символы в ответах.) _ –

+0

Дополнительная информация: http://www.boost.org/doc/libs/1_60_0/libs/optional/ DOC/HTML/факультативная/reference.html # boost_optional.reference.header__boost_none_hpp_ –

10

Один простой способ заключается в следующем:

x = optional<int>(); //reset to default 

Или просто:

x.reset(); 

Он уничтожает текущее значение, в результате чего этот неинициализированный (по умолчанию).

+12

['reset()' устарел] (http://www.boost.org/doc/libs/1_44_0/libs/optional/doc/html/boost_optional/synopsis.html) – Johnsyweb

+2

Вот [более конкретная ссылка] (http://www.boost.org/doc/libs/ 1_48_0/LIBS/факультативная/DOC/HTML/boost_optional/detailed_semantics.html # reference_optional_reset). В основном, ответ Вениамина - это новый '.reset();'. – Xeo

 Смежные вопросы

  • Нет связанных вопросов^_^