En tiempo de compilación en C++ 11 en una función de plantilla que toma 2 parámetros de plantilla, los cuales deben ser tipos enteros sin signo, me gustaría tener una variable local que tenga el tipo de cualquiera de los dos parámetros de plantilla tiene más bits. En C++ 03 podría escribir algo como:C++ 11 forma de escribir la plantilla para elegir un tipo entero más grande?
template<bool, class T, class U>
struct pick_first;
template<class T, class U>
struct pick_first<true, T, U> {
typedef T type;
};
template<class T, class U>
struct pick_first<false, T, U> {
typedef U type;
};
template<class T, class U>
struct pick_bigger {
typedef typename pick_first<(sizeof(T) >= sizeof(U)), T, U>::type type;
};
// usage
template<class uintX_t, class uintY_t>
void foo() {
typename pick_bigger<uintX_t, uintY_t>::type mylocal = 0;
// insert doing stuff with mylocal here
}
¿Puedo aprovechar ninguna de las nuevas características de C++ 11 para hacer esta simple? Sé que podría usar plantillas variadic para que funcione con más que solo pares de tipos, y en lugar de utilizar pick_first podría escribir muchas especializaciones para que funcione con los nuevos int_leastX_t y int_fastX_t tipos. Pero tengo curiosidad si hay un mejor acercamiento a esto. Tal vez de alguna manera aprovechando auto/constexpr/decltype?
¿Has considerado 'std :: common_type' –
No había oído hablar de std :: common_type! Muy interesante. Esto funcionaría para mí. Sin embargo, deberías publicar una respuesta como respuesta para poder votar;) –
@ DavidRodríguez-dribeas Pero 'common_type' no siempre funcionará debido a las reglas de promoción de enteros. Por ejemplo, 'std :: common_type :: type' es' int', que puede ser más grande que cualquiera de los 2 tipos. –
Praetorian