Especialización de plantilla en c ++

Algunas plantillas no van juntos tan fácilmente como se podría esperar porque 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 de cadena, la técnica varía según el tipo de datos. Por ejemplo, cuando se quiere utilizar stringify en una int, podría utilizar la siguiente plantilla:

#include #include using namespace std-plantilla cadena inline stringify (const T de entrada) {ostringstream salida-output lt; lt; output.str entrada de retorno () -} int main () {// Esta llamada funciona como expected.cout lt; lt; stringify(42) lt; lt; endl - // Este truncates.cout llamada 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 main (), que es una int. Sin embargo, cuando el código utiliza para una doble, el resultado se trunca como se muestra aquí:

4245.6789

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

#include #include #include #include using namespace std-plantilla cadena inline stringify (const T de entrada) {ostringstream salida-output lt; lt; output.str entrada de retorno () -} plantilla lt;> string línea stringify (doble const entrada) {ostringstream salida const int sigdigits = numeric_limits:: digits10-salida lt; lt; setprecision (sigdigits) lt; lt; output.str entrada de retorno () -} 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 ve el resultado esperado ya que el doble forma de los usos de la plantilla setprecision para modificar la ostringstream valor. Como resultado, se ve el resultado siguiente:

4245,6789012345

Como las cosas se sientan con C ++ hoy, debe crear una plantilla especial para cada tipo de datos que lo requiera. Teóricamente, si C ++ siempre consigue un tipo de() función, puede detectar el tipo de datos y agregar una interruptor 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 usted elige utilizar el typeid () función, asegúrese de que sabe que compilador de la organización va a utilizar para compilar el código de la aplicación.

Es posible que también 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 la línea como una llamada a una función separada. En algunos casos, como este stringify () función, el resultado es código que se ejecuta más rápido.

El compilador no tiene la obligación de cumplir con la 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.




» » » » Especialización de plantilla en c ++