【发布时间】:2011-02-04 00:52:26
【问题描述】:
函数能否直接返回多个值(即,不返回通过引用获取的参数)?
【问题讨论】:
-
如果您想要一个与语言无关的概述,这里有一个问题:stackoverflow.com/questions/1468375/…
-
您可以作为数组返回,也可以将数组作为引用传递并将这些值存储到该数组中。
标签: c++ return-value
函数能否直接返回多个值(即,不返回通过引用获取的参数)?
【问题讨论】:
标签: c++ return-value
是的 - 让你的函数返回一个结构。或者通过引用参数返回值。
struct A {
int x, y;
A(int x, int y) : x(x), y(y) {}
};
A myfun() {
return A(0, 42); // return two values
}
或:
void myfun(int & a, int & b) {
a = 0;
b = 42;
}
【讨论】:
不,但您可以返回一个可以包含多个值的 pair 或 boost::tuple。
此外,您可以使用引用返回多个值,如下所示:
void MyFunction(int a, int b, int& sum, int& difference);
你可以这样调用这个函数:
int result_sum;
int result_difference;
MyFunction(1, 2, result_sum, result_difference);
正如 Hogan 所指出的,从技术上讲,这并不是返回多个变量,但它是一个很好的替代品。
【讨论】:
函数可以通过指定的方式返回值:
如果您需要一个自包含的返回值,您通常会将所需的类型包装在一个结构中,并按值返回该结构的对象。如果您想避免保留本地副本,您可以传入要修改的参考参数。
【讨论】:
在boost::tuple 库中,a function called tie 简化了从返回的tuple 中获取信息的过程。如果您有一个函数返回两个doubles 中的tuple,并希望将它们加载到两个局部变量x 和y,您可以将函数的返回值分配给boost::tie(x, y)。
例子:
#include <math.h>
#include <iostream>
#include <boost/tuple/tuple.hpp>
const double PI = 3.14159265;
boost::tuple<double, double> polar_to_rectangular(double radius, double angle)
{
return boost::make_tuple(radius * cos(angle), radius * sin(angle));
}
int main()
{
double x;
double y;
boost::tie(x, y) = polar_to_rectangular(4, (45 * PI) / 180);
std::cout << "x == " << x << ", y == " << y << std::endl;
return 0;
}
【讨论】:
boost::tuple 时,它给了我错误fatal error: boost/tuple/tuple.hpp: No such file or directory,它不是某些standard library 的一部分吗?我正在使用命令g++ -std=c++11 swap.cpp -o main 在 ubuntu16.04 上运行我的程序。如果我不使用boost::tuple,我的程序运行良好!有什么建议我做错了吗?
main()
{
int a=10,b=20;
int *c;
c=aa(a,b);
printf("%d %d",*c,*c+1);
}
void aa(int a,int b)
{
int c1[2];
c1[0]=b+a;
c1[1]=a-b;
return(c1);
}
这里会返回c1的地址。所以它将存储在 main c cariable 中。我们可以通过指针检索这两个变量,
【讨论】:
aa 离开时,c1 的生命周期结束,所以c 指向一个死对象。访问它会导致未定义的行为。
使用结构并返回不同数据类型的多个值。
【讨论】:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
int a;
int b;
}Mystruct;
Mystruct myfun();
int main()
{
char name[30];
Mystruct ms2;
ms2 = myfun();
printf("val1: %d val2: %d",ms2.a,ms2.b);
return 0;
}
Mystruct myfun()
{
int a,b;
Mystruct ms;
a = 10;
b = 20;
ms.a=a;
ms.b=b;
return(ms);
}
【讨论】: