std :: optional在引擎盖下如何工作?

问题描述

我刚刚了解了c ++ 17中的std :: optional功能以及其他一些非常有用的功能...

但是我对std :: optional有一些我不了解的地方,我希望有人向我解释一下:

首先,据我在std :: optional中所知,返回值可以是指定的类型,也可以不是这样的:

std::optional<std::string> getName()
{
    if(person.hasName())
    {
        return person.name;
    }
    else 
    {
        return {};
    }
}

如何返回{}什么也不返回?例如,例如,如果我要创建一个类似的类,该类返回指定的值或什么都不返回,那么如何创建自己的类,使return {}有效?我在这里误会了什么?

我的第二个问题是,当您要检查返回值时,可以执行以下操作:

int main()
{
    std::optional<std::string> name = getName();
    if(name.has_value())  // check if the name is valid using the has_value function
    {
        ...
    }
}

或者我也可以:


int main()
{
    std::optional<std::string> name = getName();
    if(name)  // check if the name is valid only using the variable name ???
    {
        ...
    }
}

我对此感到非常困惑,变量名如何返回布尔值?不像对象的构造函数可以返回任何东西,那怎么可能呢?

再说一遍,我想创建自己的类似于std :: optional的类,该如何使它的类实例用作布尔值?

我非常感谢能解决我的问题的答案,而不是与何时使用std :: optional有关的问题,或者为什么我不应该让自己的类做同样的事情等……

谢谢!

解决方法

return {};

将仅调用该类的默认构造函数。

通过为类提供转换操作符来布尔化,可以在需要时将其隐式转换为布尔值。

看起来像

template <typename T>
class optional {
    public:
    optional() {}
    optional(T t) : has_value(true),value(std::move(t)) {}

    operator bool() {
        return has_value;
    }
    
    private:
    bool has_value = false;
    T value;
}

非常简化,缺少分配运算符等等。

,

我如何制作自己的课程,所以return {}是有效的吗?

通过使类默认为可构造。究竟该怎么做取决于类。在该类隐式默认可构造的情况下,您无需执行任何操作,而在其他情况下,则可能需要显式声明构造函数。例如:ClassName() = default;

变量名如何返回布尔值

考虑此变量名称如何“返回布尔值”:

int x = 42;
if (x)
    ;

或者该变量名称如何“返回std :: string_view”:

const char* str = "example";
std::string__view sv = str;

这称为从一种类型到另一种类型的转换。这就是if(name)中发生的事情。

我如何做到这一点,以便可以将我的类的实例用作布尔值?

通过提供转换运算符。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...