2012-05-03 17 views
6

Ho riscontrato un problema di recente. In realtà penso che non possa essere risolto come vorrei, ma sarebbe abbastanza utile se potesse. Ad ogni modo, ecco il problema:Alias ​​di specializzazione modello

Ti darò un esempio che ho visto qualche giorno fa su questo forum poiché sarà più facile spiegarlo. Diciamo che sto cercando di creare una struct Tensor, in questo modo:

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

Per evitare una ricorsione infinita, avrei dovuto scrivere la specializzazione modello per N = 1.

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

In realtà, quando N = 1, questo Tensore è in realtà un Vettore (uno fisico). Diciamo che ho già una struct Vector definita in questo modo:

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

Questa struct è esattamente come Tensor < 1>. Dato che la struttura Vector esisteva già e, diciamo che non l'ho implementata personalmente, vorrei essere in grado di rendere il Tensor < 1> un alias della struttura Vector. Proprio come un typedef. Quindi, vorrei farlo in questo modo:

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

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

In questo modo, Tensor < 1> e Vector sarebbe la stessa identica struct, quindi sarebbe ho potuto usare uno piuttosto che un altro nel programma dove mi pare e non avrei dovuto scrivere la stessa struttura due volte.

Tuttavia, in questo modo è impossibile definire una specializzazione del modello. Se lo fosse, non farei la domanda lì.

Nota: So nell'esempio precedente non è una buona dato che possiamo ancora fare questo:

using Vector = Tensor<1>; 

Ma è abbastanza fastidio se voglio farlo con specializzazioni dei due le strutture differenti. Per esempio quando si scrive una libreria geometria che potrebbe calcolare la geometria in spazi N-dimensionali:

using Circle<2> = Hypersphere<2>; 

Quindi, per riassumere: c'è un modo per creare specializzazioni template definendo come l'alias di un altro?

risposta

8

classi legacy Attribuite scalare, vettori e matrici, si potrebbe utilizzare l'ereditarietà:

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

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

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

Nota che questo non è l'abuso di eredità, perché si sta modellando un è-una relazione.

+0

Sì, ci avevo già pensato, ma se l'avessi fatto, le lezioni non sarebbero state "identiche". Voglio dire, dovrei lanciare e down_cast per passare variabili da un tipo all'altro:/ So che è solo un dettaglio e forse non è considerato sicuro come tipo pensare a quelle classi come faccio io, ma è esattamente il dettaglio Mi piacerebbe superare. Grazie comunque :) – Morwenn

+0

@Morwenn Per ulteriori generalità, il tuo esempio avrebbe bisogno di due parametri modello: 'template class Tensor . Qui, D sarebbe il numero di dimensioni spaziali. – TemplateRex

+0

Sì, ma ho appena mostrato questo esempio solo per esporre un problema sintattico. Non uso Tensors da solo o altro.E 'stato solo per cancellare la mia mente su C++ possibilità ^^" – Morwenn

Problemi correlati