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) {

背景故事。 在Excel中的VBA中,我创建了一个计算两条直线(向量)之间最短距离的函数。此函数返回外观交点以及它们之间的实际距离。 为了完成这项工作,我最终分发了一个数组,然后整理出之后的内容。它可以工作,但阅读和使用起来很笨重

在C++中,我做了一个类似的函数,返回所指向的点。
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);
}