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?

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>.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.