2010-01-12 64 views
2

试图找到一个“简单易用”的safe_bool成语/实现,我已经结束了我自己的。评论:可重用的safe_bool实现

问:这个实现是否正确?

template <typename T> 
class safe_bool 
{ 
protected: 
    typedef void (safe_bool::*bool_type)() const; 
    bool_type to_bool_type(bool b) const 
    { return b ? &safe_bool<T>::safe_bool_true : 0; } 

private: 
    void safe_bool_true() const {} 

private: 
    bool operator ==(safe_bool<T> const & rhs); 
    bool operator !=(safe_bool<T> const & rhs); 
}; 

使用这样的:

struct A : public safe_bool<A> 
{ 
    // operator bool() const { return true; } 
    operator bool_type() const { return to_bool_type(true); } 
}; 

唯一除了现有的基类是to_bool_type,但我希望我已经得到了一切正确的,太。

我使用的测试用例(VC9)can be found here

我在实现中看到的缺点:bool_typeto_bool_type在派生类中可见,这可能不适用于所有人。另外,使用错误的模板参数(例如,在复制和粘贴期间引入的class B : public safe_bool<A>)将不被注意。

回答

1

使用指向成员函数的指针作为bool别名是惯用的,就像你在这里做的那样。

你的实现看起来正确,但有些不完整。见http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool

IMO safe_bool属于做坏事多的事物而不是好事;即这个习语所引入的复杂性和困惑以及理解它所需的心智努力要比它想要解决的初始问题更大。

+0

谢谢 - 这个链接实际上是我开始的地方。我对他们的实施有一些怀疑,这就是为什么我不相信每一个iota。似乎缺少的是防止'operator ==(safe_bool )' - 但在这种情况下,这将是必要的? ----我同意复杂性与有用性评分,我的尝试是让它“减少伤害”。 – peterchen 2010-01-12 19:53:24

+1

因为safe_bool“正常工作”,所以Downvoting尤其适用,如果您将其包装在一个很好记录的可重用组件中。也就是说,在C++ 11中,只需使用'explicit operator bool()const'并使用它:-) – 2011-12-11 12:28:21

3

您提到的“错误模板参数”问题几乎完全被wikibooks.org解决方案中的static_cast所淘汰(@Terry Mahaffey引用的“用于无虚拟功能的可测试性”)。我唯一可以看到他们的解决方案错误的是单独的safe_bool_base类,它会在多个基类(或compressed_pair中的元素)出现时抑制空基优化。就我个人而言,我会将该实现移回到模板中。