簡體   English   中英

C++:當用作邏輯值時如何返回對象的集合 state

[英]C++: how to return object's set state when used as logical value

我有一些可以設置或不設置的 class :

Class obj;

我希望它的值在邏輯中使用時返回它是否已設置:

if ( obj )
    obj.Clear();

if ( !obj )
    obj.Set( "foo" );

我想添加到 bool 的隱式轉換,但我想知道是否需要 int 或者是否有更好的方法來 go 解決這個問題。

可以定義一個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");
}

output 是

o1 state is false
o2 state is true

居住

您可以使用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 (...)對語句執行顯式布爾轉換。 所以通常不需要隱式轉換。 為了避免使用重載時出現問題,對於顯式轉換運算符,您應該始終使用 go。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM