Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


Conversión explícita de tipos

§1  Sinopsis

La posibilidad de especificar explícitamente los parámetros en las funciones genéricas, hace que sea frecuente la implementación de un seudo-operador del tipo implicit_cast< T>(arg) que puede funcionar de forma análoga a los operadores C++ de modelado ( 4.9.9), pero con los tipos que disponen de una conversión implícita ( 2.2.5).

El desempeño puede realizarlo una función genérica, implementada de forma que la sintaxis de uso siga las pautas utilizadas con los operadores de modelado static_cast, reinterpret_cast, etc. aunque no tiene nada que ver con aquellos. Los operadores anteriores son implementados de forma nativa en el lenguaje, y su comportamiento no puede ser emulado mediante ningún otro artificio, mientras lo que aquí presentamos es en realidad una función genérica.

El diseño de la función genérica puede ser el siguiente:

template<class T, class S> T implicit_cast(S s) { return s; }

La invocación puede realizarse de varias formas:

T t = implicit_cast<T, S>(s);  // Ok. (S es redundante)
T t = implicit_cast<T>(s);     // Ok. (S implícito)
T t = implicit_cast<S>(s);     // Error!! (no es posible deducir T)
T t = implicit_cast(s);        // Error!! (no es posible deducir T)

Nota: la introducción de un seudo-operador como el presente, que justamente realiza el trabajo que ya realiza por su cuenta el compilador, puede parecer extraño, pero existen casos en que es conveniente poner de manifiesto explícitamente esta conversión.

El funcionamiento se basa precisamente en la conversión automática de tipos realizada (cuando es posible) por el compilador ( 2.2.5).  La función devuelve un S, pero como la definición exige que se devuelva un T, el compilador realiza una conversión automática para ajustar el tipo devuelto al esperado. Cuando la conversión automática no es posible, se obtiene un error:

int i = 10;
double d = implicit_cast<double>(i);  // Ok.
float f  = implicit_cast<float>(i);   // Ok.
char c   = implicit_cast<char>(i);    // Ok.
char* cp = implicit_cast<char*>(i);   // Error!!