Typedef de modèle C ++

369

j'ai un cours

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

Je veux faire un typedefqui crée un Vector(vecteur de colonne) qui est équivalent à un Matrixavec des tailles N et 1. Quelque chose comme ça:

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

Ce qui produit une erreur de compilation. Ce qui suit crée quelque chose de similaire, mais pas exactement ce que je veux:

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

Existe-t-il une solution ou une solution de contournement / meilleure pratique pas trop chère?

Pas dans la liste
la source

Réponses:

550

C ++ 11 a ajouté des déclarations d'alias , qui sont une généralisation de typedef, autorisant les modèles:

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

Le type Vector<3>est équivalent à Matrix<3, 1>.


En C ++ 03, l'approximation la plus proche était:

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

Ici, le type Vector<3>::typeest équivalent à Matrix<3, 1>.

GManNickG
la source
45
Oh génial, je n'avais pas vu cette partie de C ++ 0x et je ricanais à propos des typedef modèles depuis un certain temps ... je suppose que je devrais avoir une lecture plus approfondie du projet final.
Matthieu M.
2
Les constructeurs héritiers feront-ils de la solution originale de l'OP une solution plus viable?
StackedCrooked
2
@StackedCrooked: dépend de ses objectifs. J'évite l'héritage quand la composition fera l'affaire (et oui, l'héritage des constructeurs rendra les deux plus faciles), mais j'évite également la composition quand un typedef le fera.
GManNickG
1
l'utilisation ne prend pas en charge la spécialisation si je ne me trompe pas, donc la deuxième option est toujours utile dans de nombreux cas.
Utkarsh Bhardwaj