如何处理optional数据 in C++【C++学习笔记】

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")

这种给默认值是很有用的。因为通常你可能会在文件中有些东西是可选的,如果某个参数没有在文件中设置,你可用使用你指定的默认值!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值