c++ function c++11 templates return-type

¿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 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.