std::optional

一、简介

std::optional 类型是 C++17 新增的特性,它表示一个可能包含值的对象,也可以表示没有值。使用它就可以不需要使用一些特殊的值(如 NULL)或者异常来表示缺失值。

使用 std::optional,可以通过调用 std::nullopt 来表示没有值的情况。当 std::optional 包含值时,可以使用成员函数 value() 来获取该值,而且可以使用成员函数 has_value() 来检查是否有值。此外,还可以使用 * 运算符来获取值,类似于指针的解引用操作。

当一个 std::optional 对象被按语境转换成 bool 时,若对象含值则转换返回 true ,若对象不含值则返回 false 。

下面是一个使用 std::optional 的简单示例:

std::optional<int> divide(int a, int b)
{
    if (b != 0)
    {
        return a / b;
    }
    else
    {
        return std::nullopt;
    }
}

int main(int argc, char *argv[])
{
    std::optional<int> result = divide(10, 5);

    if (result.has_value())
    {
        qDebug() << "Result: " << result.value()<<*result;
    }
    else
    {
        qDebug()  << "Invalid operation!";
    }
}

二、其他

1、std::make_optional()

此函数模板接受一个参数,即要初始化的值,并返回一个 std::optional 对象,该对象包含了传入的值。

#include <iostream>
#include <optional>

struct MyStruct 
{
    int value;
};

int main(int argc, char *argv[])
{
    std::optional<int> num1 = std::make_optional<int>(42);
    std::cout << "num1: " << *num1 << std::endl;

    std::optional<MyStruct> num2 = std::make_optional<MyStruct>({10});
    std::cout << "num2: " << num2->value << std::endl;

    return 0;
}

2、value_or()

此函数接受一个参数,即默认值。如果 std::optional 包含一个值,则该函数返回该值;如果 std::optional 为空,则返回提供的默认值。

    std::optional<int> num1 = 42;

    int value = num1.value_or(0);
    qDebug() << "Value: " << value;    //42

    std::optional<int> emptyNum;
    int defaultValue = emptyNum.value_or(-1);
    qDebug() << "Default Value: " << defaultValue;    //-1

3、reset()

销毁 std::optional 对象中的值并释放相关的资源。

    std::optional<int> num1 = 42;
    qDebug() << "num1: " << *num1;

    num1.reset();
    if (!num1)
    {
        qDebug() << "num1 is empty.";
    }

 4、emplace()

在不提前创建临时对象的情况下,直接在 std::optional 对象中构造一个新的值。

5、std::nullopt 和 std::nullopt_t

std::nullopt

一个特殊的常量对象,用于表示空值的状态。当需要明确表示一个 std::optional 对象为空的时候,可以将其赋值为 std::nullopt。

示例用法:std::optional<int> value = std::nullopt;

std::nullopt_t

一个空的结构体类型,用于以明确标识空状态的初始化。当需要在构造 std::optional 对象时明确指明其为空的初始状态时,可以使用 std::nullopt_t 作为构造函数的参数。

示例用法:std::optional<int> value(std::nullopt_t{});

三种写法:

  • std::optional<int> value = std::nullopt;        //创建一个对象并将它的值赋值为空。(value此时是一个有效值,它的值表示的意思是“一个空值”)
  • std::optional<int> value(std::nullopt_t{});   //直接创建一个空对象,该对象从创建好就是空的
  • std::optional<int> value;             //创建一个对象,没有给它赋值,它是无效值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值