一般返回值处理

 void func(int arg,std::string& str1,std::string& str2)
 {
 	//相关操作
 	str1 = "result1";
 	str2 = "result2";
 }
 
 int main(){
 	//获取返回结果
 	std::string res1,res2;
 	func(1,res1,res2);
 }

使用引用传入不会造成太多的性能损失,是一种简单高效的方式,但存在一个缺点,必须初始化返回结果变量并传入到函数中
在特殊情况下,不需要某些返回值,仍然使用引用传入则不太合适。将引用改为指针,并在输出返回值时选择性输出

void func(int arg,std::string* str1,std::string* str2)
{
	//相关操作
	if(str1)
		*str1 = "result1";
	if(str2)
		*str2 = "result2";
}
 
int main(){
	//获取返回结果
	std::string res1,res2;
	func(1,&res1,&res2);
	//忽略第一个返回值
	func(2,nullptr,&res2);
}

相同类型返回值

当返回值为多个相同类型值时,可以使用数组传出

#include<iostream>  
  
std::string* func(int arg)  
{  
    //相关操作  
    std::string str1 = "result1";  
    std::string str2 = "result2";  
    return new std::string[]{str1,str2};  
}  
  
int main(){  
    //获取返回结果
    std::string* res= func(1);  
}

当数组大小确定时,可以使用 array 或者 vectorarray 是在栈中分配空间,而 vector 是在堆中分配空间

#include<iostream>
#include<array>
 
std::array<std::string, 2> func(int arg)
{
	//相关操作
	std::string str1 = "result1";
	std::string str2 = "result2";
	std::array<std::string,2> result;
	result[0] = str1;
	result[1] = str2;
	return result;
}
 
int main(){
	//获取返回结果
	std::array<std::string,2> res= func(1);
}

上述代码中的 array 可以替换成 vector,一般情况下 array 的运行速度会更快

不同类型返回值

Tuple

tuple 可以存储多种类型的值,但是在数据取出的环节较为繁琐,且可读性较差

#include<iostream>
#include<tuple>
 
std::tuple<std::string,std::string> func(int arg)
{
	//相关操作
	std::string str1 = "result1";
	std::string str2 = "result2";
	std::tuple<std::string,std::string> result(str1,str2);
	return result;
}
 
int main(){
	//获取返回结果
	std::tuple<std::string,std::string> res= func(1);
	std::cout << std::get<0>(res);
}

Pair

pair 只能存储两种类型值,相较于 tuple 的数据取出会更加便捷,但是可读性仍然较差

#include<iostream>
 
std::pair<std::string,std::string> func(int arg)
{
	//相关操作
	std::string str1 = "result1";
	std::string str2 = "result2";
	std::pair<std::string,std::string> result(str1,str2);
	return result;
}
 
int main(){
	//获取返回结果
	std::pair<std::string,std::string> res= func(1);
	std::cout << res.first;
}

Struct(推荐使用)

使用 struct 可以更好说明每个传出值的实际含义,在取数据时代码具有更高的可读性

#include<iostream>  
  
struct result{  
    std::string x;  
    std::string y;  
};  
  
result func(int arg)  
{  
    //相关操作  
    std::string str1 = "result1";  
    std::string str2 = "result2";  
    return {str1,str2};  
}  
  
int main(){  
    //获取返回结果  
    result res= func(1);  
    std::cout << res.x;  
}