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

发布时间 2023-04-03 16:03:59作者: karinto

考虑一个问题,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