c++ - C ++:使用重载显式运算符bool的类
问题描述
语境:
我有一个具有内部布尔值的类,它似乎是重载运算符 bool的一个很好的候选者,如下所示:
class MyBool{
private:
bool value_ = false;
// Nice API and logic to set the interal value_ to true or false...
public:
explicit operator bool() const {
return value_;
};
};
从https://en.cppreference.com/w/cpp/language/implicit_conversion,“上下文转换”部分,这适用于:
- if、while、for 的控制表达式;
- 内置逻辑运算符 !、&& 和 || 的操作数;
- 条件运算符的第一个操作数 ?:;
- static_assert 声明中的谓词;
- noexcept 说明符中的表达式;
这就解释了为什么我在尝试以其他方式使用它时会出错,如下所示:
MyBool x;
///...
bool y = x; // --> error: cannot convert ‘MyBool’ to ‘bool’ in initialization
// or:
bool z;
z = x; // --> error: cannot convert ‘MyBool’ to ‘bool’ in assignment
// Or returning from a function:
bool func(...){
MyBool x;
// ...
return x; // --> error: cannot convert ‘MyBool’ to ‘bool’ in return
}
// Or in Gtests, like:
MyBool x;
// ...
EXPECT_TRUE(x); // --> error: no matching function for call to ‘testing::AssertionResult::AssertionResult(MyBool)’
如果我删除了显式关键字,由于隐式转换会出现一些问题(C++ 11 之前的安全布尔成语:http: //blog.asymptotic.co.uk/2014/03/the-safe-bool-idiom-在-c/ )。
在这些情况下,我可以将MyBool变量显式转换为 bool 并且它会起作用,但对我来说,这种非同质使用类型违背了重载运算符的目的,即:能够自然地将MyBool用作 bool . 相反,我可以像这样添加一个成员函数:
bool get_value() const {
return value_;
}
并在每次我需要“强制转换”为布尔时使用 x.get_value(),即使在条件、循环等中也是如此。
问题是:有没有办法在上述情况下使用这个类,或者其中一些,只修改类代码(不是调用代码),而不删除显式关键字?(最好在 C++11 中)。
解决方案
问题似乎是如何(1)隐式转换为 bool 和(2)避免整数提升/转换。删除转换为int
:
class MyBool
{
public:
operator bool() const
{
return value_;
};
operator int() const = delete;
private:
bool value_ = false;
};
问题中的所有行现在都可以编译,因为允许隐式转换。由于删除了整数转换,因此没有任何安全布尔问题编译:
MyBool x;
int i = x;
x << 1;
x < 1;
推荐阅读
- javascript - 如何在 JavaScript 中访问 Spring Bean?
- java - 使用 C++ 编译和运行 java 文件时无法加载主类
- php - 如何比较 now() 和删除查询的 unix 时间戳?
- git - 如何设置 Jenkins 从代理的 git 用户
- c# - 如何将匿名列列表复制到会话
- javascript - 多个 GetElementByID 不起作用,如何循环 Javascript?
- java - 如何从 SSH 获取输出
- spotfire - Spotfire 过滤器适用于数据集的所有可视化
- random - 如果协商 TLS 1.2 或 TLS 1.1,如何以及为什么必须在 TLS 1.3 中覆盖最后 8 个字节,如下所述?
- javascript - 在 JavaScript Promise 中使用 return