C++:如何return对象的设置状态用作逻辑值
C++: how to return object's set state when used as logical value
我有一些class可以设置也可以不设置:
Class obj;
我希望它的值在逻辑中使用时 return 无论是否已设置:
if ( obj )
obj.Clear();
if ( !obj )
obj.Set( "foo" );
我想添加一个到 bool 的隐式转换,但我想知道是否需要 int 或者是否有更好的方法来解决这个问题。
可以定义一个bool
运算符,如下
#include <iostream>
struct Object{
bool state;
explicit operator bool()const{
return state;
}
};
int main(){
Object o1;
Object o2;
o1.state = false;
o2.state = true;
std::cout << "\no1 state is " << (o1? "true": "false");
std::cout << "\no2 state is " << (!o2? "false": "true");
}
输出为
o1 state is false
o2 state is true
您可以使用 std::optional
或 std::shared_ptr
。
示例 1:
std::optional<Object> obj = Object();
if (obj) obj->useIt();
obj.reset();
if (obj) ... ;
示例 2
std::shared_ptr<Object> obj = new Object();
if (obj) obj->useIt();
obj.reset();
if (obj) ... ;
您应该使用 std::optional
表示可选值。这是自我记录,其他程序员知道他们是关于什么的,并且您避免检查自己的不变状态 class(降低复杂性)。它还将 STL 约定用于值包装器(与迭代器、智能指针等相同)。
如果您不想或根本无法使用它,请查看它的实现并遵循相同的规则:
- 实现布尔转换运算符(显式)
- 提供一个方法(如
std::optional::has_value()
)用于模板方法
请注意,if (...)
对语句执行显式 bool-cast。所以一般不需要隐式转换。为了避免使用重载的麻烦,您应该始终使用显式转换运算符。
我有一些class可以设置也可以不设置:
Class obj;
我希望它的值在逻辑中使用时 return 无论是否已设置:
if ( obj )
obj.Clear();
if ( !obj )
obj.Set( "foo" );
我想添加一个到 bool 的隐式转换,但我想知道是否需要 int 或者是否有更好的方法来解决这个问题。
可以定义一个bool
运算符,如下
#include <iostream>
struct Object{
bool state;
explicit operator bool()const{
return state;
}
};
int main(){
Object o1;
Object o2;
o1.state = false;
o2.state = true;
std::cout << "\no1 state is " << (o1? "true": "false");
std::cout << "\no2 state is " << (!o2? "false": "true");
}
输出为
o1 state is false
o2 state is true
您可以使用 std::optional
或 std::shared_ptr
。
示例 1:
std::optional<Object> obj = Object();
if (obj) obj->useIt();
obj.reset();
if (obj) ... ;
示例 2
std::shared_ptr<Object> obj = new Object();
if (obj) obj->useIt();
obj.reset();
if (obj) ... ;
您应该使用 std::optional
表示可选值。这是自我记录,其他程序员知道他们是关于什么的,并且您避免检查自己的不变状态 class(降低复杂性)。它还将 STL 约定用于值包装器(与迭代器、智能指针等相同)。
如果您不想或根本无法使用它,请查看它的实现并遵循相同的规则:
- 实现布尔转换运算符(显式)
- 提供一个方法(如
std::optional::has_value()
)用于模板方法
请注意,if (...)
对语句执行显式 bool-cast。所以一般不需要隐式转换。为了避免使用重载的麻烦,您应该始终使用显式转换运算符。