【问题标题】:Return Multiple Values C++ [duplicate]返回多个值C ++ [重复]
【发布时间】:2015-06-26 04:21:58
【问题描述】:

有没有办法从一个函数返回多个值?在我正在处理的程序中,我希望将 4 个不同的 int 变量从一个单独的函数返回到主函数,所有统计信息都需要继续执行程序。我发现没有办法真正做到这一点。任何帮助将不胜感激,谢谢。

【问题讨论】:

标签: c++ function variables return


【解决方案1】:

C++ 不支持返回多个值,但您可以返回包含其他类型实例的类型的单个值。例如,

struct foo
{
  int a, b, c, d;
};

foo bar() {
  return foo{1, 2, 3, 4};
}

或者

std::tuple<int, int, int, int> bar() {
  return std::make_tuple(1,2,3,4);
}

或者,在 C++17 中,您将能够使用 结构化绑定,它允许您从返回表示多个值的类型的函数初始化多个对象:

// C++17 proposal: structured bindings
auto [a, b, c, d] = bar(); // a, b, c, d are int in this example

【讨论】:

  • 好的,那么我将如何将这 4 个返回值作为变量保存在 main 中呢?他们会自动覆盖以前的内容,还是我必须以某种方式手动让他们这样做?抱歉,我对 C++ 还是很陌生。
  • 很确定这就是我来这里的原因,但无论如何谢谢。
  • 查看我的回答,了解如何在返回端使用std::tie
【解决方案2】:

如果你希望返回的所有变量的类型相同,你可以只返回一个数组:

std::array<int, 4> fun() {
    std::array<int,4> ret;
    ret[0] = valueForFirstInt;
    // Same for the other three
    return ret;
}

【讨论】:

    【解决方案3】:

    一种解决方案可能是从您的函数中返回一个向量:

    std::vector<int> myFunction()
    {
       std::vector<int> myVector;
       ...
       return myVector;
    }
    

    另一种解决方案是添加参数:

    int myFunction(int *p_returnValue1, int *p_returnValue2, int *p_returnValue3)
    {
       *p_var1 = ...;
       *p_var2 = ...;
       *p_var3 = ...;
       return ...;
    }
    

    在第二个示例中,您需要声明四个变量来包含代码的四个结果。

    int value1, value2, value3, value4;
    

    之后,调用函数,将每个变量的地址作为参数传递。

    value4 = myFunction(&value1, &value2, &value3);
    

    编辑:这个问题之前已经被问过,将其标记为重复。 Returning multiple values from a C++ function

    编辑#2:我看到多个答案建议一个结构,但我不明白为什么“为单个函数声明一个结构”是相关的,因为它们显然是其他模式,比如用于此类问题的 out 参数。

    【讨论】:

    • 我的回答有问题吗?评论将不胜感激,因此我可以编辑/删除答案。
    • 不!太完美了,谢谢
    【解决方案4】:

    您可以使用以 4 个ints 作为引用的函数。

    void foo(int& a, int& b, int& c, int& d)
    {
        // Do something with the ints
        return;
    }
    

    然后像这样使用它

    int a, b, c, d;
    foo(a, b, c, d);
    // Do something now that a, b, c, d have the values you want
    

    但是,对于这种特殊情况(4 个整数),我会推荐 @juanchopanza 的答案(std::tuple)。为了完整性,我添加了这种方法。

    【讨论】:

      【解决方案5】:

      在 C++11 及更高版本中,您可以使用 std::tuplestd::tie 进行非常类似于 Python 能够返回多个值的语言风格的编程。例如:

      #include <iostream>
      #include <tuple>
      
      std::tuple<int, int, int, int> bar() {
          return std::make_tuple(1,2,3,4);
      }
      
      int main() {
      
          int a, b, c, d;
      
          std::tie(a, b, c, d) = bar();
      
          std::cout << "[" << a << ", " << b << ", " << c << ", " << d << "]" << std::endl;
      
          return 0;
      }
      

      如果你有 C++14,这会变得更加简洁,因为你不需要声明 bar 的返回类型:

      auto bar() {
          return std::make_tuple(1,2,3,4);
      }
      

      【讨论】:

        猜你喜欢
        • 2016-01-18
        • 1970-01-01
        • 2014-04-04
        • 1970-01-01
        • 2011-03-09
        • 2021-03-03
        • 2011-04-19
        • 2014-01-21
        相关资源
        最近更新 更多