Pregunta

Es posible escribir un impuro plantilla en C++?Es decir, una plantilla que va a dar a veces un diferente tipo resultante o int para los mismos parámetros de la plantilla.Por ejemplo, es posible escribir una plantilla Foo<T> donde Foo<int>::type a veces es char y en otras ocasiones float?O una plantilla Foo<T> donde Foo<double>::my_static_const_int es a veces un 10 y otras veces 20?

¿Fue útil?

Solución

No es posible.Si usted tiene una plantilla que se comporta de esa manera, viola la ODR y / o otras normas, tales como la especialización debe ser declarada antes de ser instanciado.Así que no se puede simplemente poner una especialización que de alguna manera cambiar un typedef miembro a hacer para resolver un tipo diferente de todas las referencias siguientes.

Recuerde que Foo<T> hace referencia a una clase si Foo es una plantilla de clase.Si la clase del typedef miembro se define como un tipo en un punto en el programa, y de otro tipo en otro punto, entonces algo debe haber ido mal.Aquí hay varios Estándar de citas que la preocupación de este


Una especialización de una plantilla de función, una función miembro de la plantilla, o de una función miembro o miembro de datos estáticos de una plantilla de clase puede tener varios puntos de casos dentro de una unidad de traducción.Una especialización de una plantilla de clase tiene más de un punto de la creación de instancias dentro de una unidad de traducción.Una especialización para cualquier modelo puede tener puntos de la creación de instancias en múltiples unidades de traducción.Si dos puntos diferentes de la creación de instancias de dar una plantilla de especialización de los diferentes significados de acuerdo a la definición de la regla de (3.2), el programa está mal formado, no de diagnóstico necesarios.


Si una plantilla, un miembro de la plantilla o el miembro de una plantilla de clase es explícitamente especializados, a continuación, que la especialización debe ser declarado antes de la primera utilización de la especialización que podría provocar que una implícita la creación de instancias para tomar su lugar, en cada unidad de traducción en el que dicho uso se produzca;no hay diagnóstico es necesario.


(Varios "ruido" omitido)

[..Varias entidades que pueden definirse múltiples en todo el programa..].Dada la entidad con nombre D definido en más de una unidad de traducción, a continuación,

  • cada definición de D consistirá en la misma secuencia de tokens;
  • en cada definición de D, correspondientes nombres, miró hacia arriba de acuerdo a 3.4, se refieren a una entidad definida dentro de la definición de D, o se refieren a la misma entidad, después de la resolución de sobrecarga (13.3) y después de la coincidencia parcial de la plantilla de especialización (14.8.3)...
  • Si D es una plantilla, y se ha definido en más de una unidad de traducción, a continuación, los últimos cuatro requisitos de la lista anterior, se aplicarán a los nombres de la plantilla del ámbito envolvente se utiliza en la definición de la plantilla (14.6.3), y también dependen de nombres en el punto de la creación de instancias (14.6.2).Si las definiciones de D cumplen con todos estos requisitos, entonces el programa se comportan como si fuesen una única definición de D.Si las definiciones de D no se cumplan estos requisitos, entonces el comportamiento no está definido.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top