2012-03-16 6 views
5

Supongamos que necesitamos una función que devuelva algo. Pero ese algo no se puede encontrar. Veo opciones:¿Es bueno usar boost :: tuple <bool, T> para indicar si se encontró T o no?

1. T find(bool &ok); //return default T value if not found 

Podemos hacer una estructura:

template <typename T> 
class CheckableValue 
{ 
public: 
    CheckableValue(), 
    _hasValue(false) 
    { 

    } 
    CheckableValue(const T &t): 
    _value(t), 
    _hasValue(true) 
    { 

    } 

    inline bool hasValue() const {return _hasValue} 
    const T &value() const 
    { 
     assert(hasValue()); 
     return _value; 
    } 

private: 
    T _value; 
    bool _hasValue; 
}; 

y hacer la función:

2. CheckableValue<T> find(); 

O podemos utilizar:

3.boost::tuple<bool, T> find() 

Qué hacer crees que es preferible?

Respuesta

13

Prefiero:

4. boost::optional<T> find(); 

El problema con la tupla es que la parte T no es válida cuando la parte bool es falso; este comportamiento no se aplica por la tupla. Su clase CheckableValue es el mismo remedio que boost::optional por el mismo problema.

+1

boost opcional http://www.boost.org/doc/libs/1_41_0/libs/optional/doc/html/index.html es realmente genial. Lo uso en muchos lugares que se parecen al del póster. –

0

devuelve algo. Pero ese algo no se puede encontrar.

¿Estás planeando devolver una copia, o algún tipo de referencia para la cosa? "no encontrado" implica que la función funciona al "encontrar" un valor preexistente en una estructura de datos en alguna parte.

En ese caso, la solución simple es devolver un puntero al valor existente, usando NULL para no encontrado.

+1

No puede ser necesario en alguna colección. El valor puede calcularse sobre la marcha y devuelto. Pero si alguna entrada fue incorrecta, puede levantar una bandera, lo que indica una entrada incorrecta. Devolver el puntero al objeto asignado en el objeto Heap no es conveniente, creo (se puede decir que auto_ptr hará el trabajo, pero creo que boost :: opcional es mucho mejor) – Andrew

Cuestiones relacionadas