首页 > 编程语言 >C++17:新特性之std::optional

C++17:新特性之std::optional

时间:2023-04-03 16:15:17浏览次数:35  
标签:std return string 17 tuple ss include optional size

考虑一个问题,C++如何实现返回多个值?如何标记其中一个bool返回值用于记录函数运行状态?

我们可以通过pair或tuple实现,有以下代码:

#include <iostream>
#include <string>

using namespace std;

struct ss {
	string s;
	int size;
};

pair<bool, ss> func2(const string& in) {
	ss a{"", -1};
	if (in.size() == 0) return { false, a };
	a.s = in;
	a.size = in.size();
	return { true, a };
}

int main() {
	if (auto [status, a] = func2("yeah"); status) {
		cout << a.s << " " << a.size << endl;
	}

	return 0;
}

 

可以通过C++17的新特性optional省去bool值,简化上述代码:

#include <iostream>
#include <string>
#include <optional>

using namespace std;

struct ss {
	string s;
	int size;
};

optional<ss> func3(const string& in) {
	ss a{ "", -1 };
	if (in.size() == 0) return nullopt;
	a.s = in;
	a.size = in.size();
	return { a };
}

int main() {
	if (auto ret = func3("yeah"); ret.has_value()) {
		cout << ret->s << " " << ret->size << endl;
	}

	return 0;
}

  

源代码:

#include <iostream>
#include <string>
#include <optional>

using namespace std;

struct ss {
	string s;
	int size;
};

/*
tuple<bool, string, string> func(const string& in) {
	if (in.size() == 0) return make_tuple(false, "", "");
	return make_tuple(true, in, "123654");
}*/

pair<bool, ss> func2(const string& in) {
	ss a{"", -1};
	if (in.size() == 0) return { false, a };
	a.s = in;
	a.size = in.size();
	return { true, a };
}

optional<ss> func3(const string& in) {
	ss a{ "", -1 };
	if (in.size() == 0) return nullopt;
	a.s = in;
	a.size = in.size();
	return { a };
}

int main() {
	/*
	tuple<int, double, string> r{ 12, 128.33, "happy~" };
	auto r2 = make_tuple( 12, 128.33, string("happy~") ); //tuple<int, double, string> r2

	//Structured Bindings
	if (auto [status, out1, out2] = func("unhappy!!!"); status) {
		cout << out1 << endl;
		cout << out2 << endl;
	}*/

	if (auto [status, a] = func2("yeah"); status) {
		cout << a.s << " " << a.size << endl;
	}

	if (auto ret = func3("yeah"); ret.has_value()) {
		cout << ret->s << " " << ret->size << endl;
	}

	return 0;
}

  执行结果:

yeah 4
yeah 4

  

原文:https://zhuanlan.zhihu.com/p/64985296

标签:std,return,string,17,tuple,ss,include,optional,size
From: https://www.cnblogs.com/karinto/p/17283350.html

相关文章

  • 【FastDFS分布式文件系统】5.FastDFS客户端的配置、启动和常用命令
    上一篇我们介绍了FastDFS服务端的tracker追踪服务器和storage存储服务器,本篇来介绍一下客户端的启动,以及外部客户端如何与FastDFS服务端进行连接。和之前一样,服务端部署在三台服务器上:其中192.168.195.129是tracker追踪服务器,192.168.195.130和192.168.195.131......
  • 【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接
    上一篇我们讲解了如何配置和启动FastDFS客户端,以及客户端上传下载的一些常用命令。那么,在许多需要进行分布式文件上传与下载的系统中,就不能像执行Linux命令一样去上传和下载文件,它们需要使用开发系统的语言去操作客户端使用其命令与服务端进行交互,此时FastDFS......
  • ASEMI代理HMC717ALP3E原装ADI(亚德诺)车规级HMC717ALP3E
    编辑:llASEMI代理HMC717ALP3E原装ADI(亚德诺)车规级HMC717ALP3E型号:HMC717ALP3E品牌:ADI/亚德诺封装:QFN-16批号:2023+安装类型:表面贴装型引脚数量:16类型:车规级芯片主要功能HMC717ALP3E典型应用HMC717ALP3E非常适合:固定无线和LTE/WiMAX/4GBTS和基础设施中继器和毫微微小区公共安全广播接......
  • ASEMI代理HMC717ALP3E原装ADI(亚德诺)车规级HMC717ALP3E
    编辑:llASEMI代理HMC717ALP3E原装ADI(亚德诺)车规级HMC717ALP3E型号:HMC717ALP3E品牌:ADI/亚德诺封装:QFN-16批号:2023+安装类型:表面贴装型引脚数量:16类型:车规级芯片主要功能HMC717ALP3E典型应用HMC717ALP3E非常适合:固定无线和LTE/WiMAX/4GBTS和基础设施中继器和毫微微小......
  • 17、移动端草稿
    https://www.cnblogs.com/fuckingPangzi/p/10462441.html小程序的业务域名和服务器域名的区别服务器域名是wx.request请求去拉取数据的域名。一般返回为JSON字符串业务域名是小程序的webview组件要引入的其他H5地址的URL的域名或者网页里面的iframe的域名    如果......
  • 【微信小程序-原生开发】实用教程17 - 详情页触发列表页刷新,点击图片放大预览,转发给好
    详情页触发列表页刷新需求描述:在详情页进行点赞/收藏操作,再返回到列表页,发现列表页并没有同步更新点赞/收藏的状态。解决方案:在详情页执行任何触发列表页展示内容的数据更新时,都同步执行列表页的刷新代码实现:因列表页通常为详情页的上一页,所以详情页触发列表页的刷新实际上是触发上......
  • VS2017 未能正确加载“ReferenceManagerPackage”包
    MicrosoftVisualStudio未能正确加载“ReferenceManagerPackage”包。1.以管理员身份打开DeveloperCommandPromptforVS20172.定位到你的vs2017的安装目录我安装的是企业版就是E:\ProgramFiles(x86)\MicrosoftVisualStudio\2017\Enterprise\Common7\IDE\PublicAssemblies......
  • Ubuntu 17.04 将取消 Swap 分区?
    Canonical的软件工程师DimitriJohnLedkov最近宣布即将发布的Ubuntu Linux 系统安装时将丢弃Swap分区方式,改为交换文件方式。对我们中的大多数使用带SSD或NVMe闪盘及内存充足的人来说,这不是什么大新闻。不过那些想要将Ubuntu后续版本安装在10多年前PC......
  • Ubuntu 17.04 将取消 Swap 分区?
    Canonical的软件工程师DimitriJohnLedkov最近宣布即将发布的Ubuntu Linux 系统安装时将丢弃Swap分区方式,改为交换文件方式。对我们中的大多数使用带SSD或NVMe闪盘及内存充足的人来说,这不是什么大新闻。不过那些想要将Ubuntu后续版本安装在10多年前PC......
  • day17| 110.平衡二叉树;257.二叉树的所有路径;404.左叶子之和
    110.平衡二叉树 自顶向下递归 1.获得计算二叉树高度的函数2.对于遍历到的节点,首先计算左右子树的高度,看是否平衡3.在分别遍历到左右子树,判断左子树和右子树是否平衡 代码如下:classSolution:defisBalanced(self,root:TreeNode)->bool:defhei......