【问题标题】:Can a C++ function return more than one value? [duplicate]C++ 函数可以返回多个值吗? [复制]
【发布时间】:2011-06-18 08:12:54
【问题描述】:

可能重复:
can a function return more than one value?

我想从一个 c++ 函数返回 3 个变量,但由于一个函数只能有一个运行返回值,我如何返回 3 个值。尝试使用 return(5,4);但这是一个语法错误。

【问题讨论】:

标签: c++


【解决方案1】:

C++ 函数只能返回一个值。但是,您可以通过将它们包装在一个类或结构中来返回多个值。

struct Foo
{
     int value1;
     int value2;
};

Foo SomeFunction()
{
    Foo result = { 5, 4 };
    return result;
}

或者你可以使用std::tuple,如果你的编译器支持的话。

#include <tuple>

std::tuple<int, int, int> SomeFunction()
{
    return std::make_tuple(5, 4, 3);
}

如果您事先不知道要返回多少个值,最好使用std::vector 或类似的容器。

您还可以通过为函数提供指针或引用参数并在函数中修改它们来返回多个值,但我认为返回复合类型通常是一种“更简洁”的方法。

【讨论】:

  • +1 表示 std::tuple。 :)
  • 如果你想从一个函数中接受多个值,一个方便的方法是使用std::tiestackoverflow.com/a/2573822/502144
  • @SteeveDroz,一旦将元组写入您的main() 函数,您将如何打印它?auto tup= swap(a,b); std::cout &lt;&lt; tup &lt;&lt; std::endl;,我收到error: cannot bind ‘std::ostream {aka std::basic_ostream&lt;char&gt;}’ lvalue to ‘std::basic_ostream&lt;char&gt;&amp;&amp;’ 错误。有什么建议
  • 是的,我建议你问@Sven 而不是我。我不知道,也没有给出答案。
【解决方案2】:

在 C++ 中只能返回一个值。如果您需要返回更多信息,请返回一个结构(或像 std::vector 这样的容器),或者将一些变量作为非常量引用(或指针)传递并更改它们。

【讨论】:

    【解决方案3】:

    尝试使用 return(5,4);但这是一个语法错误。

    这不是语法错误。 (5,4) 是一个有效的表达式,这里 , 是一个运算符。所以表达式(5,4) 的计算结果是最右边的操作数,即4。因此它将返回4


    现在来解决您的问题:如果现有的任何一个对您没有帮助,请定义一个 struct,并返回一个 struct 的对象,如下所示:

    struct values
    {
       int i;
       int j;
       char *other;
    };
    
    values f()
    {
      values v = {/*....*/};
       //...
       return v;
    }
    

    如果所有值的类型相同,那么你可以使用std::vector作为:

    #include <vector>  //must include it!
    
    std::vector<int> f()
    {
       std::vector<int> v;
       v.push_back(5);
       v.push_back(4);
       //so on
       //...
       return v;
    }
    

    还有其他容器,即。 std::mapstd::liststd::stack 等。使用最适合您的。还有std::pair,顾名思义,它只包含两个值。

    【讨论】:

      【解决方案4】:

      或者您可以使用std::pair 获得两个结果,并查看boost::tuple 获得两个以上的结果。它甚至可以处理同一个元组中的不同类型。

      【讨论】:

      • 你也可以用pair&lt;pair&lt;A, B&gt;, C&gt;模拟triple&lt;A, B, C&gt; :-)
      【解决方案5】:

      有几种方法可以实现这一目标。

      1. 如果您有相同类型的对象,std::array 将是一个很好的返回类型。
        如果您有不同的数字,请改用std::vector

      2. 如果你有(固定数量的)不同类型,请使用std::tuple

        std::tuple <int, long, double> f()
        {
          return std::tuple <int, long, double>( 42, 4711l, 3.141 );
        }
        

      我不知道如何返回语言或标准库中内置的不同类型的不同数量的非多态对象。

      【讨论】:

      • @Martin:在这种情况下有效。但是,如果我写的是 4711 而不是 4711l 呢?
      • 然后你得到一个编译时错误。这是一件好事。
      • @Martin:为什么会好?我宁愿采用隐式转换。
      【解决方案6】:

      不,但有两种方法可以做到这一点:

      1) 将指向要“返回”的值的指针作为参数,您可以在函数中更改它的值。

      2) 您可以创建一个包含所有这些值的struct 并返回结构。仅在确实需要时才使用它,但第一种解决方案要好得多。

      【讨论】:

        【解决方案7】:

        这里的大多数答案都是正确的,您应该返回一个结构。 如果您有兴趣,还有另一种方法,那就是发送您想要返回的变量的引用。

        例如:

        #include<iostream>
        #include<cstdio>
        using namespace std;
        bool f(int a,int b,int& q,int& r)
        {
            if(b==0)return 0;
            q=a/b;
            r=a%b;
            return 1;
        }
        
        int main()
        {
            int a=64,b=7,q,r;
            bool pos=f(a,b,q,r);
            if(pos)
            {
                printf("Quotient = %d Remainder = %d\n",q,r);
            }
            else
            {
                printf("Divison by zero not possible!\n");
            }
            return 0;
        }
        

        【讨论】:

          【解决方案8】:

          return (a, b, c, ... , n) 语句 abc 用逗号分隔,表达式计算为最右边的操作数 n。所以语法是正确的,但是不会返回多个值。

          返回多个值:

          • 将要返回的变量放入结构体中并返回。
          • 或者制作一个包含多个变量的数组(动态分配)并返回基地址

          【讨论】:

            【解决方案9】:

            在这种情况下,您必须使用指针才能从函数返回多个值。这也可以通过使用指针参数指针参数保持它们的值' 返回多个值的指针的详细用法在http://www.techyv.com/questions/how-do-i-return-multiple-variables-c-function

            【讨论】:

              【解决方案10】:

              返回一个结构。

              struct a
              {
                 int x;
                 int y;
                 int z;
              };
              
              b()
              {
                  a.x = 2;
                  a.y = 4;
                  a.z = 8;
                  return a;
              }
              

              【讨论】:

                【解决方案11】:

                你不能。但是,您可以使用技巧来伪造它。例如,让你的函数返回一个指向 int 的指针,并返回指向一个 int 数组的指针。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-02-04
                  • 1970-01-01
                  • 2011-04-07
                  • 1970-01-01
                  • 2021-04-16
                  • 1970-01-01
                  • 2011-11-28
                  • 1970-01-01
                  相关资源
                  最近更新 更多