¿Podemos tener una función con múltiples tipos de retorno?(en C++ 11 y superior)
function c++11 (3)
Aquí hay una solución de ejemplo con
std:: variant
template < typename T, typename X>
std::variant<T, X> Max_Number ( T valueA, X valueB )
{
std::variant<T, X> res;
if ( valueA > valueB )
res = valueA;
else
res = valueB;
return res;
}
Estoy tratando de escribir una función genérica que tome la entrada como
uint8
,
uint16
,
uint32
,
uint64
, .... y devuelva el valor máximo con el tipo de datos del elemento más grande.
Por ejemplo:
template < typename T, typename X>
auto Max_Number(T valueA, X valueB)
{
if (valueA > valueB)
return valueA;
else
return valueB;
}
PD: este ejemplo supone que el elemento más grande es del tipo de datos más grande.
El retorno final con un operador condicional es otra forma de hacerlo, que está disponible desde c ++ 11 .
template <typename T, typename X>
constexpr auto Max_Number(T valueA, X valueB)-> decltype(valueA > valueB ? valueA : valueB)
{
return valueA > valueB ? valueA : valueB;
}
Vea algunas ventajas de usar el tipo de retorno final aquí: Ventaja de usar el tipo de retorno final en las funciones de C ++ 11
El tipo de retorno debe determinarse en tiempo de compilación.
Puede usar
std::common_type
(desde C ++ 11):
Para los tipos aritméticos que no están sujetos a promoción, el tipo común se puede ver como el tipo de expresión aritmética (posiblemente en modo mixto) como
T0() + T1() + ... + Tn()
.
template < typename T, typename X>
typename std::common_type<T, X>::type Max_Number ( T valueA, X valueB ) {
...
}
O use
std::conditional
(desde C ++ 11) para declarar el tipo de retorno como el grande (cuyo
sizeof
es mayor).
template < typename T, typename X>
typename std::conditional<sizeof(T) >= sizeof(X), T, X>::type Max_Number ( T valueA, X valueB ) {
...
}
Tenga en cuenta que para este caso, si
T
y
X
tienen el mismo tamaño,
T
siempre se utilizará como tipo de retorno.
Si desea controlarlo con mayor precisión, puede usar algunos rasgos para especificar el tipo exacto.