versiones resueltos lenguaje ejercicios ejemplos dev codigo clases caracteristicas c++ templates

resueltos - lenguaje c++ ejemplos



Diferencia entre instanciación y especialización en plantillas de c++ (6)

¿Cuál es la diferencia entre especialización e instanciación en el contexto de las plantillas de C ++? De lo que he leído hasta ahora, lo siguiente es lo que he entendido sobre la especialización y la instanciación.

template <typename T> struct Struct { T x; }; template<> struct Struct <int> //specialization { //code }; int main() { Struct <int> s; //specialized version comes into play Struct <float> r; // Struct <float> is instantiated by the compiler as shown below }

Instanciación de Struct <float> por el compilador

template <typename T=float> struct Struct { float x; }

¿Es correcto mi entendimiento de la instanciación y especialización de plantillas?


¿Cuál es la diferencia entre especialización e instanciación en el contexto de plantillas C ++?

Normalmente (sin especializaciones presentes), el compilador creará instancias de una plantilla cuando se utilizan, sustituyendo los parámetros de plantilla reales ( int en su ejemplo) por los parámetros de plantilla formales ( T ) y luego compilando el código resultante.

Si hay una especialización presente, entonces para el (los) parámetro (s) de plantilla especial (s) especificado (s) por esa especialización, se debe usar la implementación de esa especialización en lugar de lo que el compilador crearía.


4 conceptos:

instanciación (implícita) : esto es a lo que se refiere como instanciación

instanciación explícita :: aquí es cuando le dices al compilador que cree una instancia de la plantilla con tipos dados, como este

template Struct<char>; //used to control the PLACE where the template is inst-ed

Especialización (explícita): esto es a lo que se refiere como especialización

especialización parcial esto es cuando le da una definición alternativa a una plantilla para un subconjunto de tipos, como este:

template<class T> class Struct<T*> {...} //partial specialization for pointers


En c ++ 11.

instanciación:

Crear una instancia de la plantilla con argumentos de plantilla dados

template <typename T> struct test{ T m; }; template test<int>;//explicit instantiation

que dan como resultado una definición de una estructura con una test<int> identificador test<int>

test<int> a;//implicit instantiation

si la template <typename T> struct test ha sido instanciada con el argumento T = int before (explícito o implícito), entonces es solo una instanciación de estructuras. De lo contrario, creará una instancia de la template <typename T> struct test con el argumento T = int primero implícitamente y luego instanciará una instancia de struct test<int>

especialización:

una especialización sigue siendo una plantilla , aún necesita instanciación para obtener el código real.

template <typename T> struct test{ T m; }; template <> struct test<int>{ int newM; } //specialization

La especialización de plantilla más útil es, probablemente, que puede crear diferentes plantillas para diferentes argumentos de plantilla, lo que significa que puede tener diferentes definiciones de clase o función para diferentes argumentos de plantilla .

template<> struct test<char>{ int cm; }//specialization for char test<char> a; a.cm = 1; template<> struct test<long> { int lm; }//specialization for long test<long> a; a.lm = 1;

Además de estas especializaciones de plantillas completas anteriores, allí (solo la plantilla de clases) también sale de la especialización de plantillas parciales .

template<typename T> struct test {}; template <typename T> struct test<const T>{};//partial specialization for const T template <typename A, typename B> struct test {}; template <typename B> struct test<int, B>{};//partial specialization for A = int


Una especialización de plantilla realmente cambia el comportamiento de la plantilla para un tipo específico. por ejemplo, convertir a una cadena:

template<typename T> std::string convertToString( const T& t ) { std::ostringstream oss; oss << t; return oss.str(); }

Sin embargo, vamos a especializarnos cuando nuestro tipo ya sea una cadena std :: ya que es inútil pasar por ostringstream

template<> std::string convertToString( const std::string & t ) { return t; }

También puedes especializarte para las clases.

Ahora creación de instancias: esto se hace para permitirle mover la compilación de ciertos tipos en una sola unidad de compilación. Esto puede ahorrarte tiempo de compilación y, a veces, código de hinchazón también. Digamos que hacemos lo anterior en una clase llamada StringConvert en lugar de una función.

template<typename T> class StringConvert { public: // 4 static functions to convert from T to string, string to T, // T to wstring and wstring to T using streams };

Convertiremos muchos enteros en cadenas para que podamos crear una instancia: poner esto dentro de un encabezado

extern template class StringConvert<int>;

Pon esto dentro de una unidad de compilación:

template class StringConvert<int>;

Tenga en cuenta que lo anterior también se puede hacer (sin el extern en el encabezado) con funciones que en realidad no se implementan en línea. Una de tus unidades de compilación los implementará. Sin embargo, su plantilla está limitada solo a los tipos instanciados. Algunas veces se hace cuando la plantilla tiene un destructor virtual.


Una plantilla especializada ya no es solo una plantilla. En cambio, es una clase real o una función real.

Una especialización proviene de una instanciación o una especialización explícita, cf 14.7.4 a continuación.

Una creación de instancias se basa en una definición de plantilla primaria. Una instancia de ejemplo de plantilla de clase implícita,

template<typename T> class foo {} foo<int> foo_int_object;

Una instancia de ejemplo de plantilla de clase explícita,

template class foo<double>;

Una especialización explícita tiene una definición diferente de su plantilla principal.

template<> class foo<bool> {}

// extraer del estándar

14 Plantillas

14.7 Creación de instancias y especialización de plantillas

4 Una especialización de plantilla instanciada puede ser instanciada implícitamente (14.7.1) para una lista de argumentos dada o ser instanciada explícitamente (14.7.2). Una especialización es una clase, función o miembro de clase que está instanciado o explícitamente especializado (14.7.3).


Visión de conjunto

  • Especialización: la clase, función o miembro de la clase que obtienes al sustituir los argumentos de la plantilla en los parámetros de plantilla de una plantilla de clase o función.

  • Instanciación: el acto de crear una especialización a partir de una plantilla o miembro de plantilla de clase. La especialización se puede crear a partir de una especialización parcial, miembro de plantilla de clase o fuera de una clase primaria o plantilla de función.

Una especialización explícita es aquella que define la clase, función o miembro explícitamente , sin una instanciación.