2012-05-03 27 views
6

Tengo un problema que se me ocurrió recientemente. De hecho, creo que no se puede resolver como me gustaría, pero sería muy útil si pudiera. De todos modos, aquí está el problema:Especialización de plantilla alias

Le daré un ejemplo que he visto hace unos días en este foro, ya que será más fácil de explicar con él. Digamos que estoy tratando de crear una estructura Tensor, de esta manera:

template <int N> 
struct Tensor 
{ 
    Tensor<N - 1> x; 
    Tensor<N - 1> y; 
    Tensor<N - 1> z; 
}; 

Para evitar la repetición infinita, que tendría que escribir la especialización de plantilla para N = 1.

template<> 
struct Tensor<1> 
{ 
    double x; 
    double y; 
    double z; 
}; 

En realidad, cuando N = 1, este Tensor es en realidad un Vector (físico). Digamos que ya he definido una estructura vectorial de esta manera:

struct Vector 
{ 
    double x; 
    double y; 
    double z; 
}; 

Esta estructura es exactamente igual que Tensor < 1>. Como la estructura vectorial ya existía y, digamos que no la implementé yo mismo, me gustaría poder hacer que el Tensor < 1> struct sea un alias de la estructura Vector. Como un typedef. Por lo tanto, me gustaría hacerlo de esta manera:

// C++03 
typedef Vector Tensor<1>; 

// or C++11 
using Tensor<1> = Vector; 

De esta manera, Tensor < 1> y el vector sería exactamente la misma estructura, por lo que pude utilizar uno en lugar de otro en el programa donde quiera y no tendría que escribir la misma estructura dos veces.

Sin embargo, es realmente imposible definir una especialización de plantilla de esa manera. Si lo fuera, no haría la pregunta allí.

Nota: Sé que el ejemplo anterior no es una buena idea ya que todavía podemos hacer esto:

using Vector = Tensor<1>; 

Pero es bastante molesto si quiero hacerlo con especializaciones de dos estructuras diferentes. Por ejemplo al escribir una biblioteca de geometría que podría calcular la geometría en espacios N-dimensionales:

using Circle<2> = Hypersphere<2>; 

Por lo tanto, para resumir: ¿hay una manera de crear especializaciones plantilla al definirlo como el alias de otro?

Respuesta

8

clases heredadas Dadas escalar, vectores y matrices, que podrían utilizar la herencia:

template<> 
class Tensor<0>: public Scalar {}; 

template<> 
class Tensor<1>: public Vector {}; 

template<> 
class Tensor<2>: public Matrix {}; 

Tenga en cuenta que esto no es el abuso de la herencia debido a que se está modelando una relación es-un.

+0

Sí, ya pensé en eso, pero si lo hiciera, las clases no serían las "exactamente iguales". Quiero decir que tendría que emitir y down_cast para pasar variables de un tipo al otro:/ Sé que es solo un detalle y quizás no se considera seguro pensar en esas clases de la forma en que lo hago, pero es exactamente el detalle Me gustaría superar Gracias de todos modos :) – Morwenn

+0

@Morwenn Para mayor generalidad, su ejemplo necesitaría dos parámetros de plantilla: 'template class Tensor . Aquí, D sería el número de dimensiones espaciales. – TemplateRex

+0

Sí, pero acabo de mostrar este ejemplo solo para exponer un problema sintáctico. Yo no uso Tensors ni nada por el estilo.Fue solo para despejar mi mente sobre las posibilidades de C++ ^^ " – Morwenn

Cuestiones relacionadas