2010-05-08 14 views
285

tengo una claseC++ plantilla typedef

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

Quiero hacer una typedef que crea una (vector columna) Vector lo que equivale a un Algo Matrix con tamaños de N y 1. Al igual que:

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

Que produce un error de compilación. A continuación se crea algo similar, pero no exactamente lo que quiero:

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

¿Hay una solución o una solución no es demasiado caro/mejores prácticas para ello?

+15

Recién notado (después de casi tres años), que (¿accidentalmente?) Usó 'int' en lugar de' size_t' en su solución de ejemplo. Probablemente deberían coincidir. :) – GManNickG

Respuesta

428

C++ 11 añade declaraciones de alias, que son generalización de typedef, plantillas que permiten:

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; 
}; 

En este caso, el tipo Vector<3>::type es equivalente a Matrix<3, 1>.

+32

Oh genial, no había visto esta parte de C++ 0x y he estado quejándome de typedef con plantillas por un tiempo ... supongo que debería tener una lectura más completa del borrador final. –

+2

¿Los constructores heredadores harán que la solución original de OP sea una solución más viable? – StackedCrooked

+2

@StackedCrooked: Depende de sus objetivos. Evito la herencia cuando la composición funciona (y sí, la herencia de constructores hará que ambos sean más fáciles), pero también evito la composición cuando lo haga un typedef. – GManNickG