C ++ plantilla typedef

369

Tengo una clase

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

Quiero hacer un typedefque cree un Vector(vector de columna) que sea equivalente a a Matrixcon tamaños N y 1. Algo así:

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

Lo que produce un error de compilación. Lo siguiente crea algo similar, pero no exactamente lo que quiero:

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

¿Hay una solución o una solución alternativa / práctica no demasiado costosa para ello?

No en lista
fuente

Respuestas:

550

C ++ 11 agregó declaraciones de alias , que son generalizaciones typedef, permitiendo plantillas:

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

El tipo Vector<3>es equivalente a Matrix<3, 1>.


En C ++ 03, la aproximación más cercana fue:

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

Aquí, el tipo Vector<3>::typees equivalente a Matrix<3, 1>.

GManNickG
fuente
45
Oh, genial, no había visto esta parte de C ++ 0x y he estado quejándome acerca de typedef con plantilla por un tiempo ... supongo que debería tener una lectura más completa del borrador final.
Matthieu M.
2
¿Los constructores herederos harán que la solución original del OP sea una solución más viable?
StackedCrooked
2
@StackedCrooked: depende de sus objetivos. Evito la herencia cuando la composición lo hará (y sí, heredar constructores hará que ambos sean más fáciles), pero también evito la composición cuando lo hace un typedef.
GManNickG
1
usar no admite la especialización si no me equivoco, por lo que la segunda opción sigue siendo útil en muchos casos.
Utkarsh Bhardwaj