Typedef do modelo C ++

369

Eu tenho aula

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

Eu quero fazer um typedefque cria um Vector(vetor de coluna) que é equivalente a um Matrixcom tamanhos N e 1. Algo assim:

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

O que produz erro de compilação. O seguinte cria algo semelhante, mas não exatamente o que eu quero:

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

Existe uma solução ou uma alternativa / prática recomendada não muito cara para isso?

Não está na lista
fonte

Respostas:

550

O C ++ 11 adicionou declarações de alias , que são generalizadas typedef, permitindo modelos:

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

O tipo Vector<3>é equivalente a Matrix<3, 1>.


No C ++ 03, a aproximação mais próxima foi:

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

Aqui, o tipo Vector<3>::typeé equivalente a Matrix<3, 1>.

GManNickG
fonte
45
Oh, ótimo, eu não tinha visto essa parte do C ++ 0x e estou reclamando do typedef modelado há um tempo ... acho que eu deveria ter uma leitura mais completa do rascunho final.
Matthieu M.
2
Os construtores herdados tornarão a solução original do OP mais viável?
precisa saber é o seguinte
2
@StackedCrooked: Depende de seus objetivos. Evito a herança quando a composição funciona (e sim, a herança de construtores facilita esses dois), mas também evito a composição quando um typedef o faz.
GManNickG
11
usar não suporta especialização se não estiver errado, portanto a segunda opção ainda é útil em muitos casos.
Utkarsh Bhardwaj