27

作成した関数を呼び出すときに、2 つの double 変数を返したいと思います。いくつかのチュートリアル (C++ の基本を扱う) によると、私はそれを行うことができません。

そうする方法はありますか?

4

8 に答える 8

45

変数を保持して返す単純な構造体を作成するか、 or を使用できstd::pairますstd::tuple

#include <utility>

std::pair<double, double> foo()
{
  return std::make_pair(42., 3.14);
}

#include <iostream>
#include <tuple> // C++11, for std::tie
int main()
{
  std::pair<double, double> p = foo();
  std::cout << p.first << ", " << p.second << std::endl;

  // C++11: use std::tie to unpack into pre-existing variables
  double x, y;
  std::tie(x,y) = foo();
  std::cout << x << ", " << y << std::endl;

  // C++17: structured bindings
  auto [xx, yy] = foo(); // xx, yy are double
}
于 2013-03-12T15:54:47.457 に答える
18

C++11 を使用している場合、理想的な方法はstd::tupleandを使用することstd::tieです。

std::tupleリンク先のページからの例:

#include <tuple>
#include <iostream>
#include <string>
#include <stdexcept>

std::tuple<double, char, std::string> get_student(int id)
{
    if (id == 0) return std::make_tuple(3.8, 'A', "Lisa Simpson");
    if (id == 1) return std::make_tuple(2.9, 'C', "Milhouse Van Houten");
    if (id == 2) return std::make_tuple(1.7, 'D', "Ralph Wiggum");
    throw std::invalid_argument("id");
}

int main()
{
    auto student0 = get_student(0);
    std::cout << "ID: 0, "
              << "GPA: " << std::get<0>(student0) << ", "
              << "grade: " << std::get<1>(student0) << ", "
              << "name: " << std::get<2>(student0) << '\n';

    double gpa1;
    char grade1;
    std::string name1;
    std::tie(gpa1, grade1, name1) = get_student(1);
    std::cout << "ID: 1, "
              << "GPA: " << gpa1 << ", "
              << "grade: " << grade1 << ", "
              << "name: " << name1 << '\n';
}
于 2013-03-12T16:08:20.087 に答える
18

関数内で値を設定して、2 つの double への参照を関数に渡すことができます。

void setTwoDoubles(double& d1, double& d2)
{
    d1 = 1.0;
    d2 = 2.0;
}

double d1, d2;
setTwoDoubles(d1, d2);
std::cout << "d1=" << d1 << ", d2=" << d2 << std::endl
于 2013-03-12T15:53:42.757 に答える
6

たとえば、を使用できstd::pairます。

于 2013-03-12T15:53:53.163 に答える
4

技術的には、通常変数を返す方法で 2 つの変数を返すことはできません。ただし、参照を使用することはできます。そうすれば、複数の変数を関数に渡すことができ、関数は何も返すのではなくそれらを割り当てます。

void function(double & param1, double & param2) {
    param1 = 6.28;
    param2 = 3.14;
}

そして、あなたはそれを次のように呼びます:

double var1, var2;
function(var1, var2);
于 2013-03-12T15:55:30.633 に答える
2

直接行うことはできません(戻り値が特異であるため)。
ただし、構造体にいくつかの値を入れて、それを返すことができます(ペア<>のように)。

一般的なパターンは、参照によって出力変数を返すことです。

ReturnVal Myfunction(/*in*/ BlahType _someParameters, /*out*/ ReturnType& _firstReturn, /*out*/ OtherReturnType& _secondReturn)
{
   _firstReturn = //someStuff
   _secondReturn = //someOtherStuff


return SUCCESS;
}
于 2013-03-12T15:57:41.087 に答える
2

いいえ、参照メソッドで使用する必要のある2つの変数を返すことはできません。

    #include <iostream>
using namespace std;

// function declaration
void swap(int &x, int &y);

int main ()
{
   // local variable declaration:
   int a = 100;
   int b = 200;

   cout << "Before swap, value of a :" << a << endl;
   cout << "Before swap, value of b :" << b << endl;

   /* calling a function to swap the values using variable reference.*/
   swap(a, b);

   cout << "After swap, value of a :" << a << endl;
   cout << "After swap, value of b :" << b << endl;

   return 0;
}


// function definition to swap the values.
void swap(int &x, int &y)
{
   int temp;
   temp = x; /* save the value at address x */
   x = y;    /* put y into x */
   y = temp; /* put x into y */

   return;
}

出力は100//スワップ関数200を呼び出す前のx//スワップ関数200を呼び出す前のy//スワップ関数100を呼び出した後のx//スワップ関数を呼び出した後のy

これは2つの値を返します

このリンクはあなたを助けます

于 2013-03-12T15:58:33.863 に答える
0

1 つの関数から 2 つの値を返すことはできませんが、2 つの double を含む配列またはその他の構造体へのポインターを返すことはできます。

于 2013-03-12T15:54:16.777 に答える