如何从函数返回多个类型?

时间:2015-09-26 21:01:45

标签: c++ function return arguments

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

在C ++中,我创建了一个返回相关点的类似函数。

struct point3D
{ 
double x,y,z;
}
point3D findIntersect(const vec3& vector1, const vec3& vector2)
{
// Do stuff...
return point;
}

问题: 我也希望返回长度,因为它使用了原始计算的一部分。但是大多数时候我只想要点。

我看过的可能解决方案是:

为距离编写单独的函数。当我想要它们时,需要做很多额外的工作。

  • 为此功能创建自定义结构。 似乎有点矫枉过正。
  • 像VBA函数那样返回一个数组。 结果代码不是很直观,使用时需要小心。
  • 使用可选参数作为对变量的引用来存储距离。 不起作用。编译器不允许我更改可选参数。
  • 使用像function(const argin1, const argin2, argout&, argout2&)这样的参数列表。 唉!需要用户始终期待每个变量。

我见过对的例子,但看起来他们必须是相同的数据类型。我基本上想要返回point3Ddouble

有没有人有更优雅的解决方案从函数返回多个值?

6 个答案:

答案 0 :(得分:2)

由于您不想定义自定义结构或类,我假设您希望返回值仅为point。因此,我建议您使用可选的指针参数,它的默认值为NULL,如果它不是NULL,则将距离存储在它指向的变量中。

point3D findIntersect(const vec3 &v1, const vec3 &v2, double *dist = NULL) {
  // ...
  if (dist) {
    // find the distance and store in *dist
  }
  return ... ;
}

答案 1 :(得分:1)

C ++允许您重载函数,即使用相同的名称,但使用不同的参数类型。您可以返回@Override public void actionPerformed (ActionEvent e) { String cmd = e.getActionCommand(); switch(cmd) { case "action1": // Do something break; case "action2": // Do something else break; case "potato": // Give Mr. chips a high five break; default: // Handle other cases break; } } 作为返回值,并使point3D参考参数显示为"可选"通过提供单独的重载:

length

不希望获得长度的呼叫者将调用双参数重载,而想要长度的呼叫者将调用三参数。在这两种情况下,实现都是相同的,使用双参数调用提供对长度的被忽略变量的引用。

答案 2 :(得分:1)

Straustrup和Sutter建议使用tuple/tieF.41: Prefer to return tuples to multiple out-parameters

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);
} 

答案 3 :(得分:0)

您可以使用std::pair<point3D, double>。当您需要返回两个以上的值时,还有一个std::tuple。 (注意,正如您所提到的那样,对或元组值没有相同的类型。)

答案 4 :(得分:0)

您确定可以使用pairs

std::pair<point3D, double> findIntersect(const vec3& vector1, const vec3& vector2);

答案 5 :(得分:-2)

我仍然认为您可以而且应该为您的代码创建结构(如果您的代码不是实时的话......)Stucts很常见,并且在您需要花费代码的情况下为您提供抢劫和灵活性。取决于您在代码中的这些键值对然后在几个月后实现您需要在10个位置更改它...:)