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

Live

您可以使用 std::optionalstd::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 约定用于值包装器(与迭代器、智能指针等相同)。

如果您不想或根本无法使用它,请查看它的实现并遵循相同的规则:

  1. 实现布尔转换运算符(显式)
  2. 提供一个方法(如std::optional::has_value())用于模板方法

请注意,if (...) 对语句执行显式 bool-cast。所以一般不需要隐式转换。为了避免使用重载的麻烦,您应该始终使用显式转换运算符。