Szablon C ++ typedef

368

mam klasę

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

Chcę utworzyć, typedefktóry tworzy Vector(wektor kolumny), który jest równoważny Matrixz rozmiarami N i 1. Coś w tym rodzaju:

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

Co powoduje błąd kompilacji. Poniższe tworzy coś podobnego, ale nie dokładnie tego, czego chcę:

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

Czy istnieje rozwiązanie lub niezbyt drogie obejście / najlepsza praktyka?

Spoza listy
źródło

Odpowiedzi:

548

C ++ 11 dodał deklaracje aliasów , które są uogólnieniem typedef, umożliwiając szablony:

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

Typ Vector<3>jest równoważny z Matrix<3, 1>.


W C ++ 03 najbliższym przybliżeniem było:

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

Tutaj typ Vector<3>::typejest równoważny Matrix<3, 1>.

GManNickG
źródło
45
Och, świetnie, nie widziałem tej części C ++ 0x i od jakiegoś czasu wkurzam się w temacie szablonowania maszynopisu ... myślę, że powinienem bardziej gruntownie przeczytać ostateczny szkic.
Matthieu M.,
2
Czy dziedziczenie konstruktorów sprawi, że oryginalne rozwiązanie OP będzie bardziej realne?
StackedCrooked
2
@StackedCrooked: Zależy od jego celów. Unikam dziedziczenia, gdy kompozycja się sprawdzi (i tak, dziedziczenie konstruktorów ułatwi oba te zadania), ale unikam także kompozycji, gdy zrobi to typedef.
GManNickG
1
używanie nie obsługuje specjalizacji, jeśli się nie mylę, więc druga opcja jest nadal przydatna w wielu przypadkach.
Utkarsh Bhardwaj