#include <iostream>
using namespace std;
template <class X, class Y>
Y big(X a, Y b)
{
if (a > b)
return (a);
else return (b);
}
int main()
{
cout << big(32.8, 9);
}
Aquí estoy usando plantillas en CPP, así que cuando llamo a la función sin big
pasar por argumentos double
y int
tipo, quiero la respuesta de retorno que es double
. El tipo aquí, devuelve en 32
lugar de 32.8
.
¿Cómo obtengo el resultado deseado? ¿Cómo escribir un tipo de big
función de retorno adecuado ?
c++
function
templates
return-type
function-templates
Rakshanda Meshram
fuente
fuente
std::max
se implementa. El tipo de retorno de una función debe conocerse en tiempo de compilación en C ++. Por lo tanto, no puede hacer que este tipo de retorno dependa del valor de tiempo de ejecución de sus parámetros. Es por eso que para dicha función, necesita que ambos parámetros tengan el mismo tipo (es decir, que tengan el tipo X, pero no Y).Respuestas:
Una función solo puede tener un tipo de retorno que debe conocerse en tiempo de compilación. Sin embargo, puede usar
std::common_type
, para devolver un tipo al que ambos parámetros se pueden convertir implícitamente.Eso sería
Y para comprobar que en realidad devuelve un
double
cuando se pasa unint
y undouble
podemos hacer:Que imprime
PD:
std::common_type
puede usar el operador ternario detrás de los escenarios y, como tal, esta solución no es muy diferente de las otras respuestas (auto
+ ternary). El verdadero poder destd::common_type
es que acepta cualquier número de parámetros.fuente
El tipo de retorno debe determinarse en tiempo de compilación. Puede usar el retorno final con un operador condicional , si está limitado a c ++ 11 .
Ver en vivo
Sin embargo, si tiene acceso a c ++ 14 o superior, el
auto
retorno es suficiente, ya que el compilador deducirá el tipo correcto si lo usa junto con el operador condicional de la siguiente manera:Ver en vivo
fuente
const
).Al marcar su tipo de retorno como
Y
y pasar unint
como su segundo parámetro, ha indicado claramente queY
es unint
. No hay sorpresas pasando aquí.Esto imprime los cuatro valores correctos en la pantalla.
https://godbolt.org/z/fyGsmo
Una cosa que es importante tener en cuenta es que esto solo funcionará para los tipos que se pueden comparar entre sí, es decir, el compilador convertirá implícitamente un tipo al otro para la comparación.
IMPORTANTE : los parámetros deben tomarse por referencia para evitar un comportamiento indefinido. Esto tiene que ver con el tipo de retorno al que terco tercamente.
decltype(auto)
puede devolver referencias a tipos. Si devuelve algo local a la función (recuento de argumentos), obtendrá un comportamiento indefinido.fuente
Esta no es la solución correcta para su situación precisa, con toda probabilidad: es probable que las otras respuestas estén mucho más cerca de lo que desea.
Sin embargo, si realmente necesita devolver tipos completamente diferentes en tiempo de ejecución por alguna razón, la solución correcta (desde c ++ 17 ) es usar a
std::variant
, que es una especie de unión de tipo seguro.Tenga en cuenta que entonces la responsabilidad recae en la persona que llama para tratar con el valor devuelto, lo más probable es que use
std::visit
o similar.fuente
Devuelve int porque Y es un int y le envía el 32.8. Cuando llamaste a big 32,82 es flotante, pero 8 es int y el tipo de retorno de función es Y, que también es int.
Realmente no puede solucionar esto, ya que necesita saber en tiempo de ejecución qué tipo de grandes retornos, por lo tanto, haga que ayb sean del mismo tipo:
fuente