tipos template plantillas plantilla funciones example c++ templates instantiation

template - tipos de plantillas en c++



¿Cómo puedo forzar una instancia particular de una plantilla de C++ para crear instancias? (6)

Lo que también puedes probar es instanciación explícita:

template class vector<int>; // class template int& vector<int>::operator[](int); // member template int convert<int,double>(double); // function

Ver título Tengo una plantilla. Quiero forzar una instancia particular de una plantilla para crear instancias. ¿Cómo hago esto?

Más específicamente, ¿puede forzar una clase de plantilla abstracta para instanciar?

Podría elaborar ya que tengo la misma pregunta. En mi caso, estoy construyendo una biblioteca, algunas de las implementaciones de plantillas son grandes e incluyen muchas cosas, pero solo se generan para un par de tipos. Quiero compilarlos en la biblioteca y exportar todos los métodos, pero no incluir el encabezado con el código en todas partes.

es decir:

template<class T> OS_EXPORT_DECL class MyTmpl { T *item1; public: inline T *simpleGetT() { return(item1); } /* small inline code in here */ } T *doSomeReallyBigMergeStuff(T *b); // note only declaration here }; // *** implementation source file only seen inside library template<class T> MyTmpl<T>::doSomeReallyBigMergeStuff(T *b) { ... a really big method, but don''t want to duplicate it, so it is a template ... }

Por supuesto, podría hacer referencia a todos los métodos dentro de la biblioteca que los obligarían a compilar y exportar, pero no desea agregar código innecesario a la biblioteca como el formato de argumento para los elementos y el código para llamarlos, etc.

????? específicamente estoy construyendo la biblioteca para varias versiones de MSC y GCC y compiladores de inteligencia.


No puede forzar plantillas genéricas para crear instancias, el compilador solo puede generar código si el tipo es completamente conocido.

Forzar una instanciación se realiza proporcionando todos los tipos explícitamente:

template class std::vector<int>;

La plantilla de Preguntas frecuentes de Comeaus cubre los problemas relacionados con cierto detalle.


Puede forzar la creación de instancias usando la plantilla con el parámetro deseado. Por ejemplo, puede definir una función usando todos los métodos requeridos:

void force_int_instance() { Abstract<int> *a; a->some_method(); a->some_other_method(1, 2, 3); }

No es necesario que llame a esa función en ningún lugar, por lo que no es un problema que el puntero no se haya inicializado. Pero el compilador tiene que suponer que la función puede ser llamada desde otro archivo objeto, por lo que tiene que crear una instancia de la plantilla.


Si entiendo tu pregunta correctamente, tienes una clase de plantilla y quieres forzar al compilador a generar el código para usar con algún tipo específico. Por ejemplo, es posible que desee asegurarse de que exista el código para std :: vector <int> en su programa.

La mejor manera de asegurar esto es simplemente construir una instancia de la clase:

void EnsureInstantiation() { std::vector<int> intvector; std::vector<boo> boolvector; /// etc. }

El truco es que ni siquiera tienes que llamar a EnsureInstantiation en cualquier parte de tu código. Solo asegúrate de que no sea estático o de lo contrario el compilador puede optimizarlo.


Voy a responder lo que creo que quisiste decir, no lo que dijiste.

Supongo que el problema es una de dos cosas. El primero es que tiene un código en una plantilla que no se compila cuando compila el archivo de la plantilla, lo que puede ser muy molesto. Eso se puede arreglar en la configuración del compilador.

El otro es que desea tener algo especial para un tipo en particular, quizás para depurarlo. Eso se llama instanciación explícita pero en realidad no instancia nada, solo asegura que siempre se defina después de ese punto.

http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/topic/com.ibm.vacpp6m.doc/language/ref/clrc16explicit_instantiation.htm


no se puede crear una instancia de la clase abstracta. Es probable que desee hacer algo como:

Abstract *a = new Implementation(...);

Para forzar la creación de instancias de la plantilla, llame a la plantilla con los parámetros de la plantilla:

std::max<int>(...); std::pair<int, string>(...);