2012-06-07 17 views
22

Boost.Optional utiliza un tipo ficticio para permitir la construcción de instancias no inicializadas de boost::optional<T>. Este tipo se llama none_t, y una instancia none ya está definido en un encabezado por conveniencia, lo que nos permite escribir código como el siguiente:¿Cuál es el fundamento de la implementación de boost :: none_t?

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

En cuanto a la definición de none_t, me di cuenta de que se trata, de hecho, un typedef que corresponde a un puntero a miembro de alguna estructura ficticia:

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 

¿Cuáles son las ventajas de utilizar un typedef tales complicado por una simple estructura vacía como este?

namespace boost { 

struct none_t {}; 

none_t const none; 

} // namespace boost 
+1

Me acabo de dar cuenta (me llevó un rato ...) que esta es exactamente la estructura de [Safe-Bool Idiom] (http://www.artima.com/cppsource/safebool.html). –

+0

@MatthieuM .: ¿Quiere decir que acaba de leer el comentario que Nawaz publicó en su respuesta en junio de 2012 ...? ;) –

+0

No, lo redescubrí solo:/Las mañanas son difíciles:/ –

Respuesta

17

Ah, nunca había pensado en profundizar.

Una ventaja (más o menos obvia) de un struct normal, es que ahora none se evalúa como false en contextos booleanos.

Una ventaja sobre otra "evalúa a falso" es que se impide que el puntero al miembro promueva daños a tipos integrales.

Por lo tanto, supongo que ofrece una forma segura y concisa de tener un objeto que evalúa a false.

EDITAR: Se debe reconocer aquí (hum ...) la estructura del Safe Bool Idiom.

+0

Ah ... 'boost :: none' de hecho se convierte en' false'. : D – Nawaz

+0

Eso tiene sentido, aunque realmente no veo el sentido de hacer 'none' convertible a' false'. En mi humilde opinión, solo puede dar la falsa impresión de que "ninguno" es un "opcional". Pero quizás estoy pasando por alto algunos casos de esquina anticipados por los autores de la biblioteca. –

+2

De todos modos, en otras palabras, simplemente sigue [Safe Bool Idiom] (http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool). – Nawaz

Cuestiones relacionadas