C++ 如何从函数返回多个类型?
背景故事。 在Excel中的VBA中,我创建了一个计算两条直线(向量)之间最短距离的函数。此函数返回外观交点以及它们之间的实际距离。 为了完成这项工作,我最终分发了一个数组,然后整理出之后的内容。它可以工作,但阅读和使用起来很笨重 在C++中,我做了一个类似的函数,返回所指向的点。C++ 如何从函数返回多个类型?,c++,function,return,arguments,C++,Function,Return,Arguments,背景故事。 在Excel中的VBA中,我创建了一个计算两条直线(向量)之间最短距离的函数。此函数返回外观交点以及它们之间的实际距离。 为了完成这项工作,我最终分发了一个数组,然后整理出之后的内容。它可以工作,但阅读和使用起来很笨重 在C++中,我做了一个类似的函数,返回所指向的点。 struct point3D { double x,y,z; } point3D findIntersect(const vec3& vector1, const vec3& vector2) {
struct point3D
{
double x,y,z;
}
point3D findIntersect(const vec3& vector1, const vec3& vector2)
{
// Do stuff...
return point;
}
问题是:
我还想返回长度,因为它使用了原始计算的一部分。然而,大多数时候我只想知道这一点
我研究过的可能解决方案有:
为距离编写一个单独的函数。当我想要这两样东西的时候,有很多额外的工作要做
- 为此函数创建自定义结构。看起来有点过分了
- 像VBA函数一样返回数组。生成的代码不是很直观,使用时需要小心
- 使用可选参数作为变量的引用来存储距离。不起作用。编译器不允许我更改可选参数李>
- 使用类似于
。哎呀!将要求用户始终期望每个变量都输出函数的参数列表(常量argin1、常量argin2、argout&、argout2&)
点3d
,和一个双精度
有谁有更优雅的解决方案可以从函数返回多个值吗?您可以使用
std::pair
。当您需要返回两个以上的值时,还有一个std::tuple
。(请注意,对于pair或tuple值,没有您提到的相同类型。)您确实可以使用
std::pair findIntersect(const vec3和vector1,const vec3和vector2);
因为您不想定义自定义结构或类,所以我假设您希望返回值是唯一的点。因此,我建议您使用一个可选的指针参数,它的默认值为NULL,如果它不是NULL,您将距离存储在它所指向的变量中
point3D findIntersect(const vec3 &v1, const vec3 &v2, double *dist = NULL) {
// ...
if (dist) {
// find the distance and store in *dist
}
return ... ;
}
C++允许您重载函数,即使用相同的名称,但参数类型不同。您可以返回
point3D
作为返回值,并通过提供单独的重载使length
参考参数显示为“可选”:
point3D findIntersect(const vec3& vector1, const vec3& vector2) {
double ignore;
return findIntersect(vector1, vector2, ignore);
}
point3D findIntersect(const vec3& vector1, const vec3& vector2, double &length) {
... // Implementation goes here
}
不希望返回长度的调用方将调用两个参数重载,而希望返回长度的调用方将调用三个参数一。在这两种情况下,实现都是相同的,两个参数调用提供了对长度的忽略变量的引用。我仍然认为您可以并且应该为代码创建结构(如果您的代码不是实时的..)Stucts非常常见,它为您提供了robastics和灵活性,以防您需要扩展代码。这取决于代码中的这些键值对,几个月后意识到需要在10个地方进行更改…:) Straustup和Sutter建议为此使用
tuple/tie
:
其中:
std::tuple<Point3D, double> findIntersect(/*..params..*/)
{
Point3D point3D;
double distance;
// calculate point3D & distance
return std::make_tuple(point3D, distance);
}
std::tuple findIntersect(/*…params..*/)
{
Point3D Point3D;
双倍距离;
//计算点3D和距离
返回std::make_tuple(point3D,distance);
}
std::pair
或std::tuple
可用于此操作。虽然通常需要返回多个以某种方式相关的对象,但在这种情况下,定义自己的类开始有意义。请使用可选参数,该参数是指向距离变量的指针,其默认值为NULL。如果它为NULL,不要进行任何计算,如果它不是NULL,则将距离存储在它所指向的变量中。此解决方案涵盖了我的大部分抱怨。它将:-a)让我自行决定是否使用长度。-b) 让我有条件地执行必要的代码。感谢大家提供了丰富的答案!下面是我的大致结论:struct vec3{double x,y,z;};结构点3d{double x,y,z;};point3D findIntersect(const vec3&vector1,const vec3&vector2,double*dist=NULL){point3D pointOut;pointOut.x=1;pointOut.y=2;pointOut.z=3;if(dist){//仅在需要时执行*dist=5;}return pointOut;}void main(){vec3 tv1,tv2;double length=0;point3D tPoint=findIntersect(tv1,tv2);tPoint=findIntersect(tv1、tv2和长度);std::cout
Point3D point3D;
double distance;
std::tie(point3D, distance) = findIntersect(/*..params..*/);
std::tuple<Point3D, double> findIntersect(/*..params..*/)
{
Point3D point3D;
double distance;
// calculate point3D & distance
return std::make_tuple(point3D, distance);
}