Boost.Optional utilizza un tipo fittizio per consentire la costruzione di istanze non inizializzate di boost::optional<T>
. Questo tipo è chiamato none_t
e un'istanza none
è già definito in un'intestazione per convenienza, permette di scrivere codice come la seguente:Qual è la logica alla base di boost :: none_t?
boost::optional<int> uninitialized(boost::none);
Guardando la definizione di none_t
, ho notato che in realtà è un typedef corrispondente ad un puntatore a membro a qualche struct dummy:
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
quali sono i vantaggi dell'utilizzo di un typedef così macchinosa su una semplice struct vuoto così?
namespace boost {
struct none_t {};
none_t const none;
} // namespace boost
Mi sono appena reso conto (mi ci è voluto un po '...) che questa è esattamente la struttura di [Safe-Bool Idiom] (http://www.artima.com/cppsource/safebool.html). –
@MatthieuM .: Vuoi dire che hai appena letto il commento di Nawaz pubblicato sulla tua risposta nel giugno 2012 ..? ;) –
No, lo ho riscoperto da solo:/I mattini sono difficili:/ –