C ++安全的bool包装

我试图devise一个布尔应用安全布尔成语的 包装结构。
解决这个问题的经典实现非常简单:骨架可以是这样的:

struct Bool final { Bool() = default; Bool(bool value) : _value{value} {} explicit operator bool() const { return _value; } private: bool _value{false}; }; 

我试图改进的部分是Bool是如何构build的。
例如,我想避免隐式缩小devise:

 Bool b1(45); // yields warnings, but it compiles Bool b2{3}; // not ok by standard 

我试图用模板伤害自己,但没有成功。

我怎么能使它工作?

您可以通过显式删除所有其他构造函数来实现此目的。

 struct Bool final { template<class T> Bool(T) = delete; Bool(bool value); }; 

添加并显式删除模板构造函数:

 template <typename T> Bool(T) = delete; 

它比其他任何比其他构造函数都更好地匹配其他任何东西,从而防止隐式转换。

如果你只需要:
只有“真”或“假”的variables,不能隐式转换为int /字符/指针,那么我会看看使用枚举类:

 enum class Bool { False, True, }; 

我试图devise一个布尔应用安全布尔成语的包装结构。

别。

安全的bool习惯用语仅在C ++ 03及更早的版本中有效 – 如果您通过执行如下操作来expression您的types是“真实的”:

 struct A { operator bool() const; }; 

你会遇到各种各样的问题,如:

 A{} + 4; // ok?! A{} < 0; // ok?! A{} == B{}; // ok if B also has operator bool??! 

所以安全的布尔成语是解决这个意外的隐式转换问题,使用函数指针(当然,函数指针!)。

在C ++ 11中,我们有一个更好的解决scheme:

 struct A { explicit operator bool() const; }; 

正是我们想要的。 事实上,它的devise就是为了解决这个问题。 虽然安全的布尔成语是相当复杂的脚手架, explicit operator bool是超级直接使用,只是做正确的事情。 你不需要一个包装器 – 它实际上比使用直接编写explicit operator bool更困难。

而且,你的包装对用户施加了(a)非衍生性,因为你使Bool最终成为(b)一个额外的bool成员,你必须保持同步,所以它引入而不是解决问题。 考虑一下你要实现多less工作:

 template <class T> struct my_unique_ptr : Bool { ... }; 

VS

 template <class T> struct my_unique_ptr { T* ptr; explicit operator bool() const { return ptr; } };