Chciałbym zaimplementować opcję typu Scala-like/Haskell-Like w C++. Ze względów wydajnościowych nie chcę używać dynamicznie przydzielanej pamięci, ani nie chcę używać polimorfizmu. Ponadto nie chcę, aby tworzony był obiekt typu osadzonego, jeśli opcja jest Brak.Opcja/być może klasa dla C++
Czy ktoś może mi powiedzieć, czy poniższe podejście może powodować problemy? Muszę statycznie przydzielić pamięć dla osadzonego obiektu w mojej klasie Option, ale nie mogę zdefiniować pola elementu typu osadzonego, ponieważ byłoby to zainicjowane podczas tworzenia obiektu Option, nawet jeśli opcja jest Brak.
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();
}
};
Można sprawdzić, w jaki sposób zaimplementowano [Boost.Optional] (http://www.boost.org/doc/libs/1_51_0/libs/optional/doc/html/index.html). – kennytm
Dzięki za podpowiedź. Powinienem był wiedzieć, że Boost to ma. – JohnB
To właściwie sprytna reprezentacja. Będziesz musiał również zająć się ** zadaniem **, ale poza tym bardzo podoba mi się pomysł bezpośredniego zapisywania wskaźnika, a nie tylko wartości logicznej. Na pewno ułatwia to sprawy. –