如何从函数返回多个类型
How to return more than one type from a function?
背景故事。在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&)
只是啊!将要求用户始终期望每个变量都输出
我看到过成对的例子,但它们看起来必须是相同的数据类型。我本质上想返回一个point3D
和一个double
。
对于从函数返回多个值,有人有更优雅的解决方案吗?
由于您不想定义自定义结构或类,我假设您希望返回值仅为点。所以,我建议你使用一个可选的指针参数,它的默认值是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
}
不想收回长度的调用者会调用双参数重载,而想要长度的调用者则调用三参数重载。在这两种情况下,实现都是相同的,两个参数调用提供了对长度被忽略变量的引用。
Straustrup和Sutter建议使用tuple/tie
:F.41:更喜欢将元组返回到多个输出参数
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);
}
您可以使用std::pair<point3D, double>
。还有一个std::tuple
,当您需要返回两个以上的值时。(注意,正如您所提到的,对或元组值并没有相同的类型。(
您当然可以使用对。
std::pair<point3D, double> findIntersect(const vec3& vector1, const vec3& vector2);
我仍然认为你可以也应该为你的代码创建结构(如果你的代码不是实时的…(Stuts是非常常见的,它为你提供了robastics和灵活性,以防你需要扩展代码。取决于你代码中的这些键值对,然后几个月后意识到你需要在10个地方更改它…:(
- 如何在模板参数中分离函数类型返回类型和参数
- 为什么要为指针返回类型返回一系列字符?
- 有没有办法根据运行时值的类型返回 constexpr 对象
- 从弱指针返回类型返回共享指针
- 无法为unique_ptr返回类型返回 nullptr
- 为什么双重类型返回无穷大
- std::is_arithmetic 为通用 lambda 中的 int 类型返回 false:未定义的行为?
- C 策略设计具有可变类型返回值
- 根据类型返回一个值
- 在C++中,将double转换为long的类型返回了不正确的值
- 作为宏参数的安装类型返回错误:字符串常量之前的预期非限定 id
- 具有引用类型返回的函数
- C++ 如何使模板<T>f() 为整数 T 返回 -1,为指针类型返回 nullptr
- C++模板:按类型返回值
- 以Integer返回类型返回浮点值
- 使用 C++14 的自动功能类型返回扣除代替 std::common_type 是否始终安全?
- 为什么允许新运算符向每个指针类型返回*void
- 适当的函数返回类型返回日期时间
- c++中布尔类型返回函数的默认返回值
- 在c#中使用非托管c++代码对所有double类型返回0