c++ - 评论 : reusable safe_bool implementation

标签 c++

试图找到一个“简单易用”的 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>)将不会被注意到。

最佳答案

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

关于c++ - 评论 : reusable safe_bool implementation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2051685/

相关文章:

Qt Creator 中函数的 C++ 注释

c++ - GLEW 和 glfw 编译错误 : undefined reference to symbol 'XConvertSelection'

c++ - 如何使用 lambda 表达式更改代码?

c++ - 如何在 Atom 中自动更新 C++ 标签

c++ - 有没有办法在 C++ 中延迟初始化成员变量(类)?

c++ - 在 C++ 中使用 <random>

c++ - 使用 C++ 获取网站的标题和 Favicon

c++ - 如何使用 Qt 将两个 QComboBoxes 与 C++ 互连

c++ - 在 x86_64 上非临时加载 32 位和 64 位值的 C/C++ 内在函数?

java - 将成员函数放在成员变量之前或反之亦然的原因是什么?