试图找到一个“简单易用”的 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_type
和to_bool_type
在派生类中可见,这可能不会让所有人满意。此外,使用错误的模板参数(例如在复制粘贴过程中引入的 class B : public safe_bool<A>
)将不会被注意到。
最佳答案
您提到的“错误的模板参数”问题几乎被 @Terry Mahaffey 引用的 wikibooks.org 解决方案(“无需虚拟函数的可测试性”)中的 static_cast
完全消除了。我认为他们的解决方案唯一错误的是单独的 safe_bool_base 类,当它出现在多个基类(或 compressed_pair
中的元素)中时,它将抑制空基优化)。就我个人而言,我会将该实现移回到模板中。
关于c++ - 评论 : reusable safe_bool implementation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2051685/