2011-10-27 8 views
9

Tengo una función que necesita devolver NULL en algunos casos y hay otra función que necesita probar el valor de retorno de esta función. Estoy al tanto de boost :: optional pero no estoy seguro de cómo usar la sintaxis.Cómo usar boost :: optional <T> para devolver NULL en C++?

A continuación sería un simple ejemplo de dicho uso:

int funct1(const string& key) { 
    // use iterator to look for key in a map 
    if(iterator == map.end()) { 
    return NULL // need help here! 
    else 
    return it->second; 
} 

void funct2(string key) { 
    if(funct1(key) == NULL) { // <-- need help here! 
    // do something 
    } else { 
    // do something else 
    } 

Puede alguien por favor ayuda con la sintaxis?

Gracias.

+9

Has hecho 10 preguntas y 0 respuestas. Debes regresar y aceptar las respuestas correctas. –

Respuesta

14

Permanece en el estado "NULL" hasta que lo establezca. Puede utilizar este idioma:

optional<int> funct1(const string& key) { 
    // use iterator to look for key in a map 
    optional<int> ret; 
    if (iterator != map.end()) 
    { 
    ret = it->second; 
    } 

    return ret; 
} 

continuación:

if (!funct1(key)) { /* no value */ } 
1

Prueba esto:

int funct1(const string& key) 
{ 
    // use iterator to look for key in a map 
    if(iterator == map.end()) 
    return boost::optional<int>(); 
    else 
    return boost::optional<int>(it->second); 
} 

void funct2(string key) 
{ 
    const boost::optional<int> result = funct1(key); 
    if (result.is_initialized()) 
    { 
    // Value exists (use result.get() to access it) 
    } 
    else 
    { 
    // Value doesn't exist 
    } 
} 

También me typedef la plantilla, para facilitar las cosas:

typedef boost::optional<int> OptionalInt; 
+5

La documentación de Boost.Optional dice que 'is_initialized' está en desuso; use el operador de conversión 'bool' en su lugar (por ejemplo' if (result) {...} '). Además, su tipo de retorno 'funct1' no debe ser' int'. – ildjarn

3

Permítanme mencionar algunas cosas antes de llegar al qu estion.

Si la cadena siempre debe encontrarse (error del programador si no es así) probablemente debería tirar si no puede ser en lugar de usar una opción. Incluso puede querer probar/capturar/lanzar incluso si es una entrada del usuario.

Si su clase imita el contenedor como la semántica, debe considerar el uso de un centinela end para indicar que no se encontró, no es nulo.

Sin embargo, si lo que busca es devolver una representación nula, su tipo de devolución de función sería boost::optional<int> y la devolución nula sería return boost::none;.

+1

Hola Mark B. - ¿Por qué recomiendas devolver boost :: none mientras que los otros prefieren simplemente devolver la opción en sí? ¿Hay una diferencia? Si existe, ¿cuál es el preferido en una configuración de código profesional? Mi código está destinado a ser una biblioteca que otros usuarios pueden usar, por lo que probar/atrapar/arrojar será más preferido en el código que se basa en gran medida en la entrada del usuario? Gracias. – czchlong

+0

También recomendaría usar 'boost :: none', ya que aumenta la legibilidad (en mi opinión). –

Cuestiones relacionadas