2

我正在尝试利用boost::bool_testable<>(来自 Boost.Operators)为一个类实现安全的 bool 习惯用法,但该库的最新版本(截至本文为 1.49)似乎不再具有它。

它去哪儿了?现在有没有更好的替代品,而我只是错过了它?

我不能使用 C++11,因此不能使用不需要安全布尔的语言扩展。

4

1 回答 1

6

这是一个迟到的答案,但我只在 Stack Overflow 上活跃了很短的时间,我刚刚找到了你的问题。我是 Boost.Operators 的维护者,我在 2003 年 12 月在它意外发布之前将其删除。 bool_testable

Sam Partington 几周前提出了它,我将它添加到 CVS 存储库中。一开始看起来很有希望,但很快就在某些场景中出现了问题。

IIRC派生类的主要问题与转换检测有关。可转换为,但不能转换为 的类应该 yield ,但相反,它变得模棱两可,最终导致编译失败。Tboost::bool_testable<T>boolintboost::is_convertible<T,int>::value == false

还有其他问题,解决其中一个问题通常意味着破坏另一个问题。一个示例涉及用户想要显式转换到的类型bool 他自己的operator int().

所以,长话短说,我们从来没有想出如何让它足够健壮。如有疑问,与潜在问题相比,好处太小了(安全的 ~ 5 行复制粘贴代码),我决定安全行事,因此我将其删除。

在它被删除之后,这个问题就再也没有出现过,人们最终开始将 Safe-Bool-Idiom 代码复制粘贴到他们的类中,或者(一段时间后)他们开始使用explicit operator bool()它。

也就是说,最好手动复制这些行。我知道这不是一个优雅的解决方案,我也不喜欢复制粘贴,但替代方案都比这更糟糕。

于 2013-03-27T00:07:12.637 回答