C ++ - Vorlage typedef

369

ich habe ein klasse

template<size_t N, size_t M>
class Matrix {
    // ....
};

Ich möchte ein machen typedef, das einen Vector(Spaltenvektor) erzeugt, der einem Matrixmit den Größen N und 1 entspricht. So etwas:

typedef Matrix<N,1> Vector<N>;

Was zu Kompilierungsfehlern führt. Das Folgende schafft etwas Ähnliches, aber nicht genau das, was ich will:

template <size_t N>
class Vector: public Matrix<N,1>
{ };

Gibt es eine Lösung oder eine nicht zu teure Problemumgehung / Best Practice dafür?

Notinlist
quelle

Antworten:

550

C ++ 11 fügte Alias-Deklarationen hinzu , die verallgemeinernd typedefsind und Vorlagen zulassen:

template <size_t N>
using Vector = Matrix<N, 1>;

Der Typ Vector<3>entspricht Matrix<3, 1>.


In C ++ 03 war die nächste Annäherung:

template <size_t N>
struct Vector
{
    typedef Matrix<N, 1> type;
};

Hier ist der Typ Vector<3>::typeentspricht Matrix<3, 1>.

GManNickG
quelle
45
Oh, großartig, ich hatte diesen Teil von C ++ 0x nicht gesehen und habe mich eine Weile mit typedef-Vorlagen beschäftigt ... denke, ich sollte den endgültigen Entwurf gründlicher lesen.
Matthieu M.
2
Wird das Erben von Konstruktoren die ursprüngliche Lösung des OP zu einer praktikableren Lösung machen?
StackedCrooked
2
@StackedCrooked: Kommt auf seine Ziele an. Ich vermeide die Vererbung, wenn die Komposition ausreicht (und ja, das Erben von Konstruktoren erleichtert beides), aber ich vermeide auch die Komposition, wenn ein typedef ausreicht.
GManNickG
1
Die Verwendung unterstützt keine Spezialisierung, wenn ich mich nicht irre, daher ist die zweite Option in vielen Fällen immer noch nützlich.
Utkarsh Bhardwaj