【发布时间】:2012-06-07 15:11:56
【问题描述】:
Boost.Optional 使用虚拟类型来允许构造 boost::optional<T> 的未初始化实例。这种类型称为none_t,为了方便,已经在头部定义了一个实例none,允许我们编写如下代码:
boost::optional<int> uninitialized(boost::none);
查看none_t的定义,我注意到它实际上是一个typedef,对应于指向某个虚拟结构的指向成员的指针:
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
与这样的简单空结构相比,使用这种复杂的 typedef 有什么优势?
namespace boost {
struct none_t {};
none_t const none;
} // namespace boost
【问题讨论】:
-
我刚刚意识到(花了我一段时间...)这正是Safe-Bool Idiom 的结构。
-
@MatthieuM.:您的意思是您刚刚阅读了 Nawaz 在 2012 年 6 月在您的回答中发表的评论......? ;)
-
不,我自己重新发现了它:/早上很困难:/
标签: c++ boost boost-optional