Boost.Optional sử dụng loại giả để cho phép tạo các phiên bản chưa được khởi tạo của boost::optional<T>
. Đây là loại được gọi là none_t
, và một thể hiện none
đã được xác định trong một tiêu đề cho thuận tiện, cho phép chúng ta viết mã như sau:Lý do cơ bản để tăng cường :: none_t implementation là gì?
boost::optional<int> uninitialized(boost::none);
Nhìn vào định nghĩa của none_t
, tôi nhận thấy rằng nó là trong thực tế typedef tương ứng với cấu trúc con trỏ tới thành viên của một số cấu trúc giả:
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
Lợi thế của việc sử dụng kiểu chữ phức tạp trên cấu trúc rỗng đơn giản như thế này là gì?
namespace boost {
struct none_t {};
none_t const none;
} // namespace boost
Tôi vừa mới nhận ra (đã cho tôi một thời gian ...) rằng đây chính xác là cấu trúc của [Safe-Bool Idiom] (http://www.artima.com/cppsource/safebool.html). –
@MatthieuM .: Bạn có nghĩa là bạn vừa đọc bình luận Nawaz đăng trên câu trả lời của bạn vào tháng 6 năm 2012 ..? ;) –
Không, tự khám phá lại nó:/Buổi sáng rất khó:/ –