2012-05-03 19 views
6

Ich habe ein Problem, das ich vor kurzem kam. Ich denke, dass es nicht so gelöst werden kann, wie ich es gerne hätte, aber es wäre sehr praktisch, wenn es möglich wäre. Wie auch immer, hier ist das Problem:Vorlage Spezialisierung Alias ​​

Ich werde Ihnen ein Beispiel geben, das ich vor ein paar Tagen in diesem Forum gesehen habe, da es einfacher sein wird, damit zu erklären. Nehmen wir an, ich versuche, ein Tensor-Struktur zu schaffen, auf diese Weise:

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

Um unendliche Rekursion zu vermeiden, würde ich die Template-Spezialisierung für N = 1.

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

Eigentlich schreiben müssen, wenn N = 1, dieser Tensor ist eigentlich ein Vektor (physikalisch). Sagen wir, ich schon ein Vektor-Struktur auf diese Weise definiert haben:

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

Diese Struktur genau wie Tensor ist < 1>. Da die Vektorstruktur bereits existierte und, sagen wir, ich sie nicht selbst implementiert hatte, würde ich gerne in der Lage sein, den Tensor < 1> einen Alias ​​der Vektorstruktur zu strukturieren. Genau wie ein typedef. So würde Ich mag es auf diese Weise tun:

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

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

diese Weise Tensor < 1> und Vektor würde genau die gleiche Struktur, so dass es würde ich ein anstelle eines anderen im Programm verwenden könnte, wo immer ich will und ich müsste nicht zweimal dieselbe Struktur schreiben.

Es ist jedoch tatsächlich unmöglich, eine Template-Spezialisierung auf diese Weise zu definieren. Wenn es so wäre, würde ich die Frage dort nicht stellen.

Hinweis: Ich weiß, dass das vorherige Beispiel, da wir dies nicht gut ist noch tun können:

using Vector = Tensor<1>; 

Aber es ist ziemlich lästig, wenn ich es mit Spezialisierungen von zwei verschiedenen Strukturen tun mag. Zum Beispiel, wenn eine Geometrie-Bibliothek zu schreiben, die Geometrie in N-dimensionalen Räumen berechnen könnte:

using Circle<2> = Hypersphere<2>; 

Also, um es zusammenzufassen: Gibt es eine Möglichkeit Vorlage Spezialisierungen zu schaffen, indem sie als Alias ​​eines anderen zu definieren?

Antwort

8

Da Legacy-Klassen Scalar, Vektor und Matrix, könnten Sie Vererbung:

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

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

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

Beachten Sie, dass dies nicht Missbrauch der Vererbung ist, weil Sie eine ist-eine Beziehung modellieren.

+0

Ja, daran dachte ich schon, aber wenn ich das täte, wären die Klassen nicht die "exakt gleichen". Ich meine, ich müsste cast und down_cast, um Variablen von einem Typ zum anderen zu übergeben:/ Ich weiß, es ist nur ein Detail und vielleicht ist es nicht als Typ sicher, diese Klassen so zu denken, wie ich es tue, aber es ist genau das Detail Ich würde gerne überwinden. Danke trotzdem :) – Morwenn

+0

@Morwenn Für mehr Allgemeingültigkeit würde Ihr Beispiel zwei Vorlagenparameter benötigen: 'Vorlage Klasse Tensor . Hier wäre D die Anzahl der räumlichen Dimensionen. – TemplateRex

+0

Ja, aber ich zeige dieses Beispiel nur, um ein Syntaxproblem aufzudecken. Ich verwende Tensors nicht selbst oder so.Es war nur, um mich über C++ Möglichkeiten klar zu machen ^^ " – Morwenn

Verwandte Themen