boost :: none_t实现的基本原理是什么?

时间:2012-06-07 15:11:57

标签: c++ boost boost-optional

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

1 个答案:

答案 0 :(得分:17)

啊,我从未想过要深入挖掘。

常规struct的一个(或多或少明显)优势是,现在none在布尔上下文中求值为false

优于另一个“评估为假”的一个优点是,可以防止指向成员的指针对整数类型的有害促销。

所以,我想它提供了一种安全,简洁的方法,可以将对象评估为false

编辑:人们应该在这里认识(哼......)Safe Bool Idiom的结构。