网站建设seo 视频教程,简单网页制作成品和代码,手机网页图片,福州网站建设优化基础介绍
c17版本引入了std::optional特性#xff0c;这一个类模板#xff0c;基本的使用方法如下#xff1a; std::optionalT 这个新特性的含义是利用std::optionalT创建的某个类型的对象#xff0c;这个对象存储某个类型的值#xff0c;这个值可能存在…基础介绍
c17版本引入了std::optional特性这一个类模板基本的使用方法如下 std::optionalT 这个新特性的含义是利用std::optionalT创建的某个类型的对象这个对象存储某个类型的值这个值可能存在也可能不存在。
举个例子
std::optionalint a; //创建一个空的std:optional对象
std::optionalint b(21);//创建一个包含值的optional
std::optionalstd::string c(hello); //创建一个包含值的optional主要操作
本小节主要介绍std::optional对象的常用方法。
检查optional是否有值
optional对象采用has_value查看这个对象内是否有值如下所示
#include optional
#include iostreamvoid func()
{std::optionalint a(30);if(a.has_value()){std::cout 有值 std::endl;}else{std::cout 没有值 std::endl;}//或者采用下面的方式,这种方式是将一个类转换为某种类型if(a){std::cout 有值 std::endl;}
}
optional如何赋值
前面的例子中介绍采用了构造函数的方式进行初始化除此之外还有其他的初始化方式请看下面的示例
#include optional
#include iostreamvoid func()
{std::optionalint a(30); //初始化方式一std::optionalint b;b 2; //初始化方式二
}
optional获取值
那如何从optional中如何获取值呢请看下面的例子
#include optional
#include iostreamvoid func()
{std::optionalint a(30); //初始化方式一int value1 a.value();int value2 *a; //通过解引用的方式int value3 a.value_or(-1); //这是一个如果有值就返回实际值value_or的参数是默认值如果optional中不包含值则返回这个默认值
}
optional重置
#include optional
#include iostreamvoid func()
{std::optionalint a(30); //初始化方式一a.reset(); //清除值a std::nullopt; //另外一种方式
}
实际应用场景
函数返回值类的成员变量函数的参数替代特殊值表示无用的情况
#include optional
#include string
#include iostream// 示例1函数返回值可能不存在的情况
std::optionalint divide(int a, int b) {if (b 0) {return std::nullopt; // 返回空optional}return a / b; // 返回计算结果
}// 示例2类中使用optional成员
class User {
private:std::string name;std::optionalstd::string nickname;std::optionalint 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::optionalint port;std::optionalstd::string host;std::optionalbool useSSL;
};// 1. 使用optional代替特殊值
std::optionalint parse_int(const std::string str) {try {return std::stoi(str);} catch (...) {return std::nullopt;}
}// 2. 函数参数中的可选值
class Widget {
public:void configure(std::optionalint width std::nullopt,std::optionalint height std::nullopt) {if (width) {// 设置宽度}if (height) {// 设置高度}}
};// 3. 避免optionaloptionalT
// 不好的写法
std::optionalstd::optionalint bad;
// 好的写法
std::optionalint good;注意事项
std::optional如果利用std::nullopt赋值则表示将这个对象进行重置这个对象内不包含值。