Vorrei implementare un'opzione Scala-like/Haskell-like in C++. Per ragioni di efficienza, non voglio usare memoria allocata dinamicamente, né voglio usare il polimorfismo. Inoltre, non desidero creare alcun oggetto del tipo incorporato se l'opzione è Nessuno.Opzione/Forse classe per C++
Qualcuno può dirmi se il seguente approccio potrebbe causare problemi? Devo allocare staticamente memoria per l'oggetto incorporato all'interno della mia classe Option, ma non posso definire un campo membro del tipo embedded, poiché questo sarebbe inizializzato alla creazione dell'oggetto Option anche se l'opzione è None.
template <typename T>
class Option {
private:
uint8_t _storage [sizeof (T)];
T * _embedded;
public:
Option() : _embedded (nullptr) {
}
Option (const T & obj) : _embedded (new (_storage) T (obj)) {
}
Option (const Option<T> & other)
: _embedded (
other->_embedded ? new (_storage) T (other->_embedded) : nullptr
) {
}
// ...
~Option() {
if (_embedded) _embedded->~T();
}
};
È possibile verificare come viene implementato [Boost.Optional] (http://www.boost.org/doc/libs/1_51_0/libs/optional/doc/html/index.html). – kennytm
Grazie per il suggerimento. Avrei dovuto sapere che Boost ce l'ha. – JohnB
In realtà è una rappresentazione abbastanza intelligente. Dovresti occuparti anche di ** assignment **, ma altrimenti mi piace molto l'idea di memorizzare direttamente un puntatore piuttosto che un semplice booleano. Rende le cose più facili in seguito. –