dieron una plantilla como¿es posible la creación de instancias de plantilla explícita recursiva?
template<int dim> class Point { ... };
esta plantilla se pueden crear instancias de forma explícita como
template class Point<0>;
template class Point<1>;
template class Point<2>;
template class Point<3>;
en lugar de crear instancias de todas las plantillas de forma individual como la de arriba, me gustaría crear instancias de ellos de forma recursiva con una llamada como
template class RecursiveInstantiate<Point, 3>;
donde RecursiveInstantiate<T, i>
instanciaría T<i>
, T<i-1>
, ..., T<0>
. ¿Es de alguna manera posible crear una clase de este tipo RecursiveInstantiate
? Si no es posible, ¿conoce una forma de hacerlo con el preprocesador?
De hecho, estoy interesado en generalizar esto para las clases con múltiples parámetros de plantilla como Node<int i1,int i2,int i3>
para todas las combinaciones de i1, i2, i3 en {0,1,2,3}. Pero espero ser capaz de resolver esta segunda parte yo solo.
Se agradece cualquier consejo, también una explicación de por qué es imposible lo que quiero lograr.
Actualización: gracias por sus comentarios hasta el momento. Ahora veo más claramente dónde está realmente el problema. La línea
template class Point<3>;
ejemplifica la plantilla y exporta sus símbolos al archivo objeto. Una instancia de la forma
template class RecursiveInstantiate<Point, 3>;
puede crear instancias de las clases class Point<3>
, class Point<2>
, .... Al parecer, esto sólo ocurre localmente sin embargo. Las plantillas no se exportan al archivo objeto. Tal vez tendré que buscar una solución usando el preprocesador.
Como veo ahora que al principio no hice mi pregunta con precisión, agradezco sus respuestas y las seleccionadas como correctas.
Nota: Estoy intentando esto en linux con g ++/clang como compiladores.
Hazlo 'plantilla struct I {T p; I ; }; ... '. Además, el uso de meta-algoritmos y meta-funciones evitaría el recuento de parámetros de codificación dura (vea lo que hace Boost.MPL). –
@Georg: ¡Me gusta tu estilo! –
Esta solución se ve muy bien, realmente me gusta su solución genérica. Todavía tengo problemas para hacer que esto funcione. El enfoque se compila muy bien, sí, pero de alguna manera los símbolos del 'Punto <0>' no se exportan al archivo objeto, que es lo que haría el código 'clase de plantilla Punto <0>; '. Tendré que investigar esto más mañana. Estoy usando g ++/clang en Linux, pero no estoy seguro de si esto es específico de mi arquitectura. –