为了账号安全,请及时绑定邮箱和手机立即绑定

从C+函数返回多个值

从C+函数返回多个值

C++
MMMHUHU 2019-06-24 10:36:34
从C+函数返回多个值是否有从C+函数返回多个值的首选方法?例如,假设一个函数将两个整数除以并返回商和余数。我通常看到的一种方法是使用引用参数:void divide(int dividend, int divisor, int& quotient, int& remainder);变体是返回一个值,并通过一个引用参数传递另一个值:int divide(int dividend, int divisor, int& remainder);另一种方法是声明一个包含所有结果的结构,并返回以下内容:struct divide_result {     int quotient;     int remainder;};divide_result divide(int dividend, int divisor);这些方法中的一种是普遍倾向的,还是有其他的建议?编辑:在现实世界的代码中,可能有两个以上的结果.它们也可能是不同类型的。
查看完整描述

3 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

在C+11中,您可以:

#include <tuple>std::tuple<int, int> divide(int dividend, int divisor) {
    return  std::make_tuple(dividend / divisor, dividend % divisor);}#include <iostream>int main() {
    using namespace std;

    int quotient, remainder;

    tie(quotient, remainder) = divide(14, 3);

    cout << quotient << ',' << remainder << endl;}

在C+17中:

#include <tuple>std::tuple<int, int> divide(int dividend, int divisor) {
    return  {dividend / divisor, dividend % divisor};}#include <iostream>int main() {
    using namespace std;

    auto [quotient, remainder] = divide(14, 3);

    cout << quotient << ',' << remainder << endl;}

或结构:

auto divide(int dividend, int divisor) {
    struct result {int quotient; int remainder;};
    return result {dividend / divisor, dividend % divisor};}#include <iostream>int main() {
    using namespace std;

    auto result = divide(14, 3);

    cout << result.quotient << ',' << result.remainder << endl;

    // or

    auto [quotient, remainder] = divide(14, 3);

    cout << quotient << ',' << remainder << endl;}


查看完整回答
反对 回复 2019-06-24
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

就我个人而言,我通常不喜欢返回参数,原因如下:

  • 在调用中,哪些参数是ins,哪些是Out,这并不总是显而易见的。
  • 通常您必须创建一个局部变量来捕获结果,而返回值则可以内联使用(这可能是一个好主意,也可能不是一个好主意,但至少您有此选项)。
  • 在我看来,有一个“在门”和一个“室外”功能似乎更干净-所有的输入都在这里,所有的输出都在那里。
  • 我喜欢尽量简短地列出我的论点。

我对配对/元组技术也有一些保留。主要是,返回值往往没有自然的顺序。代码的读者如何才能知道结果。首先是商还是余数?实现者可以更改顺序,这会破坏现有的代码。如果值是相同的类型,这样就不会生成编译器错误或警告,这就特别危险了。实际上,这些参数也适用于返回参数。

下面是另一个代码示例,这个示例不那么简单:

pair<double,double> calculateResultingVelocity(double windSpeed, double windAzimuth,
                                               
double planeAirspeed, double planeCourse);pair<double,double> result = calculateResultingVelocity(25, 320, 280, 90);
cout << result.first << endl;cout << result.second << endl;

这是打印地面速度和航向,还是航向和地面速度?这并不明显。

与此相比:

struct Velocity {
    double speed;
    double azimuth;};Velocity calculateResultingVelocity(double windSpeed, double windAzimuth,
    double planeAirspeed, double planeCourse);Velocity result = calculateResultingVelocity(25, 320, 280, 90);
    cout << result.speed << endl;cout << result.azimuth << endl;

我觉得这更清楚。

所以我认为我的第一选择一般是结构技术。在某些情况下,这对/元组的想法可能是一个很好的解决方案。如果可能的话,我想避免返回参数。


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 496 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信