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?
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::tie
que 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 untie(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::pair
por 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);
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
-
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
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