目录

stdoptional详解

std::optional详解

c++17版本引入了std::optional特性,这一个类模板,基本的使用方法如下:

std::optional 这个新特性的含义是利用std::optional创建的某个类型的对象,这个对象存储某个类型的值,这个值可能存在,也可能不存在。 举个例子: std::optional a; //创建一个空的std:optional对象 std::optional b(21);//创建一个包含值的optional std::optional c(“hello”); //创建一个包含值的optional

本小节主要介绍std::optional对象的常用方法。

optional对象采用has_value查看这个对象内是否有值,如下所示; #include #include void func() { std::optional a(30); if(a.has_value()) { std::cout«" 有值 “< #include void func() { std::optional a(30); //初始化方式一 std::optional b; b = 2; //初始化方式二 }

那如何从optional中如何获取值呢,请看下面的例子: #include #include void func() { std::optional a(30); //初始化方式一 int value1 = a.value(); int value2 = *a; //通过解引用的方式 int value3 = a.value_or(-1); //这是一个如果有值就返回实际值,value_or的参数是默认值,如果optional中不包含值则返回这个默认值 }

#include #include void func() { std::optional a(30); //初始化方式一 a.reset(); //清除值 a = std::nullopt; //另外一种方式 }

  1. 函数返回值
  2. 类的成员变量
  3. 函数的参数
  4. 替代特殊值,表示无用的情况 #include #include #include // 示例1:函数返回值可能不存在的情况 std::optional divide(int a, int b) { if (b == 0) { return std::nullopt; // 返回空optional } return a / b; // 返回计算结果 } // 示例2:类中使用optional成员 class User { private: std::string name; std::optional nickname; std::optional age; public: User(const std::string& n) : name(n) {} void setNickname(const std::string& nick) { nickname = nick; } std::string getDisplayName() const { return nickname.value_or(name); // 如果有昵称返回昵称,否则返回名字 } }; // 示例3:配置选项 struct Configuration { std::optional port; std::optional host; std::optional useSSL; }; // 1. 使用optional代替特殊值 std::optional parse_int(const std::string& str) { try { return std::stoi(str); } catch (…) { return std::nullopt; } } // 2. 函数参数中的可选值 class Widget { public: void configure(std::optional width = std::nullopt, std::optional height = std::nullopt) { if (width) { // 设置宽度 } if (height) { // 设置高度 } } }; // 3. 避免optional> // 不好的写法 std::optional> bad; // 好的写法 std::optional good;

std::optional如果利用std::nullopt 赋值,则表示将这个对象进行重置,这个对象内不包含值。