76.如何处理optional数据 in C++
当我们的数据可能存在,也可能不存在的时候会发生什么呢?
std::optional
是C++17的新东西,用于检测数据是否存在or是否是我们期盼的形式,用于处理那些可能存在,也可能不存在的数据or一种我们不确定的类型
在老处理方法中可以用返回引用的bool值来判断是否数据存在
#include <iostream>
#include <fstream>
std::string ReadFile(const std::string &fileapath, bool &outSuccess) {
std::ifstream stream(filepath);
//如果成功读取了文件
if (stream) {
std::string result;
steam.close;
outSuccess = true; //读取成功,修改bool
return result;
}
outSuccess = false; //反之
}
int main() {
bool flag;
auto data = ReadFile("data.txt", flag);
//如果文件有效,则接着操作
if (flag) {
xxxxx
}
}
而用optional来做这件事会更好
🍅std::optional的用法
首先要包含头文件#include <optional>
#include <iostream>
#include <fstream>
#include <optional> //必要头文件
//下面这里的返回值就成了std::optional<std::string>,std::string这个类型是可选的
//如果这里报错说std空间中没有optional,那就是没用C++17去运作
std::optional<std::string> ReadFile(const std::string &fileapath) {
std::ifstream stream(filepath);
//如果成功读取了文件
if (stream) {
std::string result;
steam.close;
return result;
}
return {}; //返回一个std::optional
}
int main() {
bool flag;
auto data = ReadFile("data.txt“);
//如果文件有效,则接着操作
//这里就利用到了optional,因为这里的data的类型是std::optional !!!!
if (data.has_value()) {
std::string &str = *data; //要读取data里的可选的string数据,则对data进行解引用就可以了
/*当然还可以用data.value()来访问数据
std::string &str = data.value();
*/
std::cout << "文件成功被打开\n";
}
/*当然因为data对象有一个bool运算符,所以也可以不用写has_value()
if (data) { //这里完全没问题,而且更加干净漂亮
XXXX
}
*/
else {
std::cout << "文件未能成功打开\n";
}
}
当读取的文件里面存在可用数据时,就可用optional
来判断且读取里面的数据
而当里面没有数据或者要读取的文件压根就不存在的时候,则optional
会返回false
,或者也可以给optional
一个默认值
std::optional<std::string>data = ReadFile("data.txt");
//如果读取成功,value就会获取data用ReadFile返回的字符串值
//如果没读取成功,则取另一个值:"not present"
std::string value = data.value_or("not present")
这种给默认值是很有用的。因为通常你可能会在文件中有些东西是可选的,如果某个参数没有在文件中设置,你可用使用你指定的默认值!!!