代码之家  ›  专栏  ›  技术社区  ›  peterchen

回顾:可重用的安全布尔实现

c++
  •  2
  • peterchen  · 技术社区  · 16 年前

    为了找到一个“简单易用”的安全习惯用法/实现,我终于找到了自己的。

    问:这个实现正确吗?

    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_type to_bool_类型 在派生类中是可见的,这可能不会让每个人都满意。此外,使用错误的模板参数(例如。 class B : public safe_bool<A>

    2 回复  |  直到 7 年前
        1
  •  1
  •   Terry Mahaffey    16 年前

    使用指向成员函数的指针作为bool别名是惯用的,正如您在这里所做的那样。

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

        2
  •  4
  •   Dave Abrahams    14 年前

    您提到的错误模板参数问题几乎被 static_cast 在@Terry Mahaffey引用的wikibooks.org解决方案中(用于无虚拟函数的可测试性)。我能看出他们的解决方案唯一的错误是 safe_bool_base 类,当空基优化出现在多个基类(或 compressed_pair