2012-06-07 14 views
22

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 
+1

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). –

+0

@MatthieuM .: Vuoi dire che hai appena letto il commento di Nawaz pubblicato sulla tua risposta nel giugno 2012 ..? ;) –

+0

No, lo ho riscoperto da solo:/I mattini sono difficili:/ –

risposta

17

Ah, non avevo mai pensato di scavare più a fondo.

Uno (più o meno ovvio) vantaggio di un normale struct, è che ora none è valutato in false in contesti booleani.

Un vantaggio rispetto a un altro "viene valutato come falso" è che il puntatore al membro viene impedito dalla promozione dannosa ai tipi interi.

Quindi, suppongo che offra un modo sicuro e conciso di avere un oggetto che valuti a false.

MODIFICA: Uno dovrebbe riconoscere qui (hum ...) la struttura dello Safe Bool Idiom.

+0

Ah ... "boost :: none' converte effettivamente in' false'. : D – Nawaz

+0

Questo ha senso, anche se non vedo davvero il punto nel rendere 'none' convertibile in' false'. IMHO, può solo dare la falsa impressione che "none" sia un "optional". Ma forse sto trascurando alcuni casi angolari anticipati dagli autori della biblioteca. –

+2

Ad ogni modo, in altre parole, segue solo [Safe Bool Idiom] (http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool). – Nawaz

Problemi correlati