返回多个值C ++

时间:2015-04-19 14:13:31

标签: c++ function variables return

有没有办法从函数中返回多个值?在我正在编写的程序中,我希望将4个不同的int变量返回到main函数,从单独的函数返回,继续通过该程序所需的所有统计数据。我发现没有办法真正做到这一点。非常感谢任何帮助,谢谢。

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:7)

使用C ++ 11及更高版本,您可以使用std::tuplestd::tie进行非常符合Python语言风格的编程,以及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);
}

答案 2 :(得分:4)

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

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:我看到多个答案暗示一个结构,但我不明白为什么&#34;声明一个单一函数的结构&#34;当它们显然是其他模式,如出于这类问题的out参数时,是相关的。

答案 3 :(得分:2)

如果您想要返回的所有变量的类型相同,您只需返回它们的数组:

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

答案 4 :(得分:1)

您可以使用一个以int为参考的函数。

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)。为了完整性,我添加了这种方法。