¿Cómo configurar un impulso :: opcional de nuevo a un estado no inicializado?

2 minutos de lectura

avatar de usuario
chico sirton

¿Cómo puedo “restablecer” https://stackoverflow.com/”unset” a boost::optional?

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
}

  • Es un poco un misterio para mí por qué no hay optional::clear o optional::empty.

    – pmr

    22 de enero de 2012 a las 1:56

  • Probablemente porque no es necesario que haya uno.

    – Carreras de ligereza en órbita

    22 de enero de 2012 a las 1:57

  • @LightnessRacesinOrbit: ¿Puede dar más detalles? Estoy viendo esto en el contexto de las variables miembro opcionales en las que esencialmente desea restablecer parte del estado de un objeto. Tal vez haya una mejor manera de hacerlo.

    – Guy Sirton

    22 de enero de 2012 a las 2:04

  • @Guy: En su lugar, explique (para pmr) por qué debe haber un optional::clear o optional::empty.

    – Carreras de ligereza en órbita

    22 de enero de 2012 a las 3:48

  • @LightnessRacesinOrbit: No dije que tiene que haber uno 🙂 pero lo intentaré, tenemos vector::clear y shared_ptr::reset, entonces, ¿por qué es opcional::borrar u opcional::reiniciar diferente? ¿Está diciendo que no se debe restablecer opcional o está diciendo que el lenguaje de asignación es todo lo que uno necesita o está diciendo que solo debería haber una forma de hacer algo? No estoy discutiendo, solo estoy interesado en tus pensamientos…

    – Guy Sirton

    22 de enero de 2012 a las 23:10

avatar de usuario
benjamin lindley

x = boost::none;

  • [citation needed] (Es por eso que “tuvo” que evadir el límite mínimo de caracteres en las respuestas).

    – Carreras de ligereza en órbita

    22 de enero de 2012 a las 3:48


  • Algunos detalles más: boost.org/doc/libs/1_60_0/libs/opcional/doc/html/opcional/…

    – Kirill Golikov

    22 de abril de 2016 a las 12:24

Una forma sencilla es esta:

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

O simplemente:

x.reset(); 

Destruye el valor actual, dejándolo sin inicializar (predeterminado).

  • reset() es obsoleto

    – johnsyweb

    22 de enero de 2012 a las 2:05

  • Aquí está un enlace mas especifico. Básicamente, la respuesta de Benjamin es la nueva .reset();.

    – Xeo

    22 de enero de 2012 a las 2:40

  • optional<T>::reset(); es simple de usar correctamente y difícil de usar incorrectamente, entonces, ¿por qué desaprobarlo? (cita de una famosa directriz de Scott Meyers)

    – floreciente

    13 de abril de 2018 a las 15:47

¿Ha sido útil esta solución?