Devolviendo dos variables en una función de C++ [duplicate]

5 minutos de lectura

Me gustaría devolver dos variables dobles: al llamar a una función que he creado. De acuerdo con algunos tutoriales (que tratan los conceptos básicos de C ++), no podría hacer eso.

¿Hay una manera de hacerlo?

  • Consulte stackoverflow.com/q/321068/10077

    – Fred Larson

    12 de marzo de 2013 a las 15:55

  • En caso de que alguien (¡como yo!) olvide cómo hacerlo en C, el truco es pasar un puntero a la función y “devolver” vacío. Como ejemplo, una función que recibe dos dobles (x,y) y devuelve el vector dividido por la norma (x/d,y/d), donde d = sqrt(x²+y²): void normalized(double x1, double x2, double * vector){ double norm; norm = sqrt(x1*x1+x2*x2); vector[1] = x1/norm; vector[2] = x2/norm; }

    – LCM

    3 de diciembre de 2019 a las 16:41


avatar de usuario de juanchopanza
juanchopanza

Puede escribir una estructura simple que contenga las variables y devolverla, o usar un std::pair o 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
}

  • También podría querer mencionar std::tieque se puede utilizar para capturar el rendimiento en dos variables preexistentes separadas.

    – Benjamín Lindley

    12 de marzo de 2013 a las 16:04


  • @BenjaminLindley Buena sugerencia. Se agregó un ejemplo.

    – juanchopanza

    12 de marzo de 2013 a las 16:13

  • También ahora puedes hacer return { 42., 3.14 }; que es aún más bonito y rápido (evita la construcción de un par si tienes un tie(x,y) Por otro lado

    – WurmD

    12 de marzo de 2019 a las 10:45

Si está usando C++ 11, diría que la forma ideal es usar std::tuple y std::tie.

Ejemplo tomado de la std::tuple página a la que me vinculé:

#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';
}

Puede pasar referencias a dos dobles en una función, estableciendo sus valores dentro de la función

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

Puedes usar un std::pairpor ejemplo.

Técnicamente, no, no puede devolver dos variables de la forma en que normalmente devolvería una variable. Sin embargo, puede utilizar referencias. De esa forma, puede pasar varias variables a una función y la función las asignará, en lugar de devolver nada:

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

Y lo llamarías así:

double var1, var2;
function(var1, var2);

Avatar de usuario de Yochai Timmer
yochai timmer

No puede hacerlo directamente (porque un valor de retorno es singular).
Pero, podría poner algunos valores en una estructura y devolver eso (como un par ).

Un patrón común es devolver variables de salida por referencia:

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


return SUCCESS;
}

No, no puede devolver dos variables que necesita usar por método de referencia como

    #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;
}

la salida será 100 // x antes de llamar a la función de intercambio 200 // y antes de llamar a la función de intercambio 200 // x después de llamar a la función de intercambio 100 // y después de llamar a la función de intercambio

esto como devolver dos valores

este enlace te ayuda

  • Hola, creo que esta respuesta debe modificarse debido a las nuevas características de C++ 11 (y superior) como std::pair.

    – WY Hsu

    4 de febrero de 2019 a las 15:09

¿Ha sido útil esta solución?