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; } };