我正在尝试利用boost::bool_testable<>
(来自 Boost.Operators)为一个类实现安全的 bool 习惯用法,但该库的最新版本(截至本文为 1.49)似乎不再具有它。
它去哪儿了?现在有没有更好的替代品,而我只是错过了它?
我不能使用 C++11,因此不能使用不需要安全布尔的语言扩展。
我正在尝试利用boost::bool_testable<>
(来自 Boost.Operators)为一个类实现安全的 bool 习惯用法,但该库的最新版本(截至本文为 1.49)似乎不再具有它。
它去哪儿了?现在有没有更好的替代品,而我只是错过了它?
我不能使用 C++11,因此不能使用不需要安全布尔的语言扩展。
这是一个迟到的答案,但我只在 Stack Overflow 上活跃了很短的时间,我刚刚找到了你的问题。我是 Boost.Operators 的维护者,我在 2003 年 12 月在它意外发布之前将其删除。 bool_testable
Sam Partington 几周前提出了它,我将它添加到 CVS 存储库中。一开始看起来很有希望,但很快就在某些场景中出现了问题。
IIRC派生类的主要问题与转换检测有关。可转换为,但不能转换为 的类应该 yield ,但相反,它变得模棱两可,最终导致编译失败。T
boost::bool_testable<T>
bool
int
boost::is_convertible<T,int>::value == false
还有其他问题,解决其中一个问题通常意味着破坏另一个问题。一个示例涉及用户想要显式转换到的类型bool
和他自己的operator int()
.
所以,长话短说,我们从来没有想出如何让它足够健壮。如有疑问,与潜在问题相比,好处太小了(安全的 ~ 5 行复制粘贴代码),我决定安全行事,因此我将其删除。
在它被删除之后,这个问题就再也没有出现过,人们最终开始将 Safe-Bool-Idiom 代码复制粘贴到他们的类中,或者(一段时间后)他们开始使用explicit operator bool()
它。
也就是说,最好手动复制这些行。我知道这不是一个优雅的解决方案,我也不喜欢复制粘贴,但替代方案都比这更糟糕。