从函数中返回多个值
方法1:封装命名类或结构对象中的值。 要求类或结构定义对调用方可见:
#include <string>
#include <iostream>
using namespace std;
struct S
{
string name;
int num;
};
S g()
{
string t{ "hello" };
int u{ 42 };
return { t, u };
}
int main()
{
S s = g();
cout << s.name << " " << s.num << endl;
return 0;
}
方法2:返回std::tuple或者std::pair
#include <tuple>
#include <string>
#include <iostream>
using namespace std;
tuple<int, string, double> f()
{
int i{ 108 };
string s{ "Some text" };
double d{ .01 };
return { i,s,d };
}
int main()
{
auto t = f();
cout << get<0>(t) << " " << get<1>(t) << " " << get<2>(t) << endl;
// --or--
int myval;
string myname;
double mydecimal;
tie(myval, myname, mydecimal) = f();
cout << myval << " " << myname << " " << mydecimal << endl;
return 0;
}
方法3、使用结构化绑定
C++11新增的容器std::tuple
用于构造一个元组,进而囊括多个返回值。但是并没有提供一种简单的方法直接从元组中拿到并定义元组的元素,尽管我们可以使用std::tie对元组进行拆包,但是我们依然必须非常清楚这个元组包含多少个对象,各个对象是什么类型,非常麻烦
C++17提出的结构化绑定就是用来解决这个问题的
#include <tuple>
#include <string>
#include <iostream>
using namespace std;
std::tuple<int, std::string, double> ff()
{
return std::make_tuple(1, "a", 1.1);
}
/*
std::tuple<int, std::string, double> f()
{
int i{ 108 };
std::string s{ "Some text" };
double d{ .01 };
return { i,s,d };
}
*/
int main()
{
auto[x, y, z] = f(); // init from tuple
printf("%d, %s, %f\t", x, y.c_str(), z);
return 0;
}
struct S
{
std::string name;
int num;
};
S g()
{
std::string t{ "hello" };
int u{ 42 };
return { t, u };
}
int main()
{
auto[a, b] = g(); // init from POD struct
cout << a << " " << b << endl;
return 0;
}
这玩意怎么解决啊!!!!!!!
方法4:
除了使用返回值本身以外,您还可以通过定义任意数量的参数以使用传递引用来返回值,以便函数可以修改或初始化调用方提供的对象的值。