die folgenden zwei Anwendungsszenarien In Anbetracht (genau so, wie Sie sie sehen, das heißt, wird der Endanwender nur daran interessiert sein, sich mit der Vector2_t
und Vector3_t
):Vererbung vs Spezialisierung
[1] Vererbung:
template<typename T, size_t N> struct VectorBase
{
};
template<typename T> struct Vector2 : VectorBase<T, 2>
{
};
template<typename T> struct Vector3 : VectorBase<T, 3>
{
};
typedef Vector2<float> Vector2_t;
typedef Vector3<float> Vector3_t;
[2] Spezialisierung:
template<typename T, size_t N> struct Vector
{
};
template<typename T> struct Vector<T, 2>
{
};
template<typename T> struct Vector<T, 3>
{
};
typedef Vector<float, 2> Vector2_t;
typedef Vector<float, 3> Vector3_t;
ich kann mich nicht entschließen, zu der eine schönere Lösung ist. Der offensichtliche Vorteil der Vererbung ist die Wiederverwendung von Code in den abgeleiteten Klassen. ein möglicher Nachteil ist die Leistung (größere Größe, Benutzer können nach Wert übergeben, usw.). Spezialisierung scheint all das zu vermeiden, aber auf Kosten von mir, mich mehrfach zu wiederholen.
Welche anderen Vorteile/Nachteile habe ich vermisst, und Ihrer Meinung nach, welche Route sollte ich nehmen?
Die vollständigste Antwort. Vielen Dank! –
Nett und COOL Antwort. Nimmt einen Guru, um eine so elegante Antwort zu bekommen. –
+1. Ich vermute, Ihr Vorschlag von enable_if <> in einer einzelnen Klassenvorlage ist der beste Weg - sicherlich würde der einzige Unterschied zwischen den Vorlagenklassen für verschiedene Vektordimensionen die Anzahl der Parameter im Konstruktor sein? –