2012-06-07 24 views
22

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

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

+0

@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 ..? ;) –

+0

Không, tự khám phá lại nó:/Buổi sáng rất khó:/ –

Trả lời

17

Ah, tôi chưa bao giờ nghĩ đến việc đào sâu hơn.

Một (nhiều hơn hoặc ít rõ ràng) lợi thế để thường xuyên struct, là bây giờ none đánh giá để false trong bối cảnh boolean.

Một lợi thế khác "đánh giá sai" là con trỏ tới thành viên được ngăn không cho quảng cáo có hại đến các loại tích phân.

Vì vậy, tôi đoán rằng nó cung cấp một cách an toàn và súc tích để có một đối tượng đánh giá là false.

CHỈNH SỬA: Người ta phải nhận ra ở đây (hum ...) cấu trúc của Safe Bool Idiom.

+0

Ah ... 'boost :: none' thực sự chuyển thành' false'. : D – Nawaz

+0

Điều đó có ý nghĩa, mặc dù tôi không thực sự thấy điểm trong việc biến 'none' thành' false'. IMHO, nó chỉ có thể cho ấn tượng sai rằng 'none' là một' tùy chọn'. Nhưng có lẽ tôi đang xem xét một số trường hợp góc dự đoán của các tác giả thư viện. –

+2

Dù sao, nói cách khác, nó chỉ theo [Safe Bool Idiom] (http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool). – Nawaz

Các vấn đề liên quan