Tôi muốn thực hiện một tùy chọn giống như Scala/Haskell giống như lớp C++. Vì lý do hiệu quả, tôi không muốn sử dụng bộ nhớ được phân bổ động, cũng như tôi không muốn sử dụng đa hình. Ngoài ra, tôi không muốn bất kỳ đối tượng nào của kiểu được nhúng được tạo nếu Option là None.Tùy chọn/Có thể lớp cho C++
Ai có thể cho tôi biết liệu cách tiếp cận sau có thể gây ra sự cố không? Tôi phải phân bổ bộ nhớ tĩnh cho đối tượng nhúng trong lớp Option, nhưng tôi không thể định nghĩa một trường thành viên của kiểu được nhúng, vì điều này sẽ được khởi tạo khi tạo đối tượng Option ngay cả khi Option là 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();
}
};
Bạn có thể kiểm tra cách [Boost.Optional] (http://www.boost.org/doc/libs/1_51_0/libs/optional/doc/html/index.html) được triển khai. – kennytm
Cảm ơn gợi ý. Tôi nên biết Boost có nó. – JohnB
Nó thực sự là một đại diện thông minh. Bạn sẽ cần phải đối phó với ** gán ** quá, nhưng nếu không tôi thực sự thích ý tưởng trực tiếp lưu trữ một con trỏ chứ không chỉ là một boolean. Làm cho mọi thứ dễ dàng hơn sau đó chắc chắn. –