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
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). –
@MatthieuM .: ¿Quiere decir que acaba de leer el comentario que Nawaz publicó en su respuesta en junio de 2012 ...? ;) –
No, lo redescubrí solo:/Las mañanas son difíciles:/ –