Especialización de plantilla en c ++

Algunas plantillas no van juntos tan fácilmente como se podría esperar debido a que expresan un concepto que no se traduce de la misma manera para cada tipo de datos. Por ejemplo, cuando se utiliza stringify para convertir un tipo de datos en su representación como cadena, la técnica varía en función del tipo de datos. Por ejemplo, cuando se quiere utilizar stringify en una int, puede utilizar la siguiente plantilla:

#incluir #incluir using namespace std-plantilla cadena de línea stringify (T const& de entrada) {ostringstream salida-salida lt; lt; output.str de entrada de retención () -} int main () {// Esta llamada funciona como expected.cout lt; lt; stringify(42) lt; lt; endl - // Esta llamada truncates.cout lt; lt; stringify(45.6789012345) lt; lt; endl retorno 0-}

los stringify () función acepta cualquier tipo de datos y simplemente utiliza una ostringstream para convertir entrada a una cuerda. Este enfoque funciona bien para la primera llamada en principal(), que es una int. Sin embargo, cuando el código se utiliza para una doble, el resultado se trunca, como se muestra aquí:

4245.6789

Puede solucionar este problema mediante la adición de un manejo especial para una doble. Aquí es la forma modificada del ejemplo (como se muestra en StringifyDouble) Que aloja una doble.

Video: Tutorial C++ Plantillas auto (C++14)

#incluir #incluir #incluir #incluir using namespace std-plantilla cadena de línea stringify (T const& de entrada) {ostringstream salida-salida lt; lt; output.str de entrada de retención () - plantilla} lt; gt; inline cadena stringify (Doble const& de entrada) {ostringstream salida-const int sigdigits = numeric_limits:: digits10-salida lt; lt; setprecision (sigdigits) lt; lt; output.str de entrada de retención () -} int main () {cout lt; lt; stringify(42) lt; lt; endl-cout lt; lt; stringify(45.6789012345) lt; lt; endl retorno 0-}

Al ejecutar este ejemplo, se muestra el resultado esperado debido a que el doble forma de los usos plantilla setprecision para modificar el ostringstream valor. Como resultado, se ve el resultado siguiente:

4.245,6789012345

Como las cosas se sientan con C ++ hoy, se debe crear una plantilla especial para cada tipo de datos que lo requiera. En teoría, si C ++ siempre consigue un tipo de() función, se puede detectar el tipo de datos y añadir una cambiar para realizar el procesamiento especializado dentro de una única plantilla.

los typeid () función podría funcionar como un sustituto de tipo de(), pero es específica del proveedor y no se han aplicado en todas las versiones de C ++. Si decide utilizar el typeid () función, asegúrese de que sabe lo que su organización compilador utilizará para compilar el código de la aplicación.

Es posible que también se ha notado la en línea palabra clave utilizada para la plantilla en este ejemplo. los en línea palabra clave indica al compilador para colocar el código creado por la plantilla en línea con el código en el que aparece, en lugar de fuera de línea como una llamada a una función separada. En algunos casos, como el presente stringify () función, el resultado es el código que se ejecuta más rápido.

Video: 67. Programación en C++ || Funciones || Ejercicio - Enviando datos a una plantilla de función

El compilador no tiene la obligación de cumplir con el en línea palabra clave. Además, desea código de la plantilla coloca fuera de línea cuando se debe realizar un cierto nivel de creación de instancias o no representar código de ruta crítica que la aplicación puede llamar a menudo.

Artículos Relacionados