Instanciación de plantilla explícita recursiva para exportar símbolos para una biblioteca

StackOverflow https://stackoverflow.com/questions/7398964

Pregunta

En mi pregunta anterior hice ¿Es posible la instanciación de la plantilla explícita recursiva?. Vi que de hecho es posible; Sin embargo, esta instanciación resulta ser efectiva solo localmente, los símbolos de la plantilla instanciada recursivamente no se exportan al archivo de objeto y, por lo tanto, no aparecen en la biblioteca (compartida). Así que hago preguntas aquí más precisamente como en mi publicación anterior:

Dado una plantilla como

template<int dim> class Point { ... };

Esta plantilla se puede instanciar explícitamente como

template class Point<0>;
template class Point<1>;
template class Point<2>;
template class Point<3>;

que exporta los símbolos de Point<0>, ..., Point<3> en el archivo de objeto de la unidad de traducción actual. En lugar de instanciar cada plantilla individualmente como arriba, me gustaría instanciarlas de manera recursiva con una sola llamada.

Cualquier solución que logre esto está bien, ya sea en el estilo de metaprogramación de plantilla, a través de una clase de ayuda como

template class RecursiveInstantiate<Point, 3>;

o a través del preprocesador. Aquí miré la biblioteca del preprocesador de Boost, que parece tener algunas construcciones de bucle. Sin embargo, nunca usé la biblioteca del preprocesador Boost (cualquier consejo es apreciado), pero a primera vista, soy escéptico si los bucles se pueden usar junto con una instancia de plantilla explícita.

Cualquier consejo, también una explicación por qué es imposible lo que quiero lograr es apreciado.


De hecho, estoy interesado en generalizar esto para clases con múltiples parámetros de plantilla comoNode<int i1,int i2,int i3> Para toda la combinación de i1, i2, i3 en {0,1,2,3}. Pero espero poder resolver esta segunda parte por mí mismo. Como de costumbre, quiero utilizar las instancias explícitas para acelerar los tiempos de compilación solo definiendo las plantillas en una unidad de traducción, por lo que necesito que los métodos se planten a exportar en el archivo de objeto.

Espero una solución independiente del compilador, pero si eso no es posible, lo necesito para Linux con G ++/Clang.


Vea a continuación una encuesta de las soluciones que obtuve y las soluciones finales que hice de esto.

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top