Typedef modello C ++


369

Ho una lezione

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

Voglio fare un typedefche crea un Vector(vettore di colonna) che è equivalente a a Matrixcon dimensioni N e 1. Qualcosa del genere:

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

Che produce errori di compilazione. Quanto segue crea qualcosa di simile, ma non esattamente quello che voglio:

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

Esiste una soluzione o una soluzione / pratica ottimale non troppo costosa?

Risposte:


550

C ++ 11 ha aggiunto dichiarazioni alias , che sono generalizzazione di typedef, consentendo modelli:

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

Il tipo Vector<3>è equivalente a Matrix<3, 1>.


In C ++ 03, l'approssimazione più vicina era:

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

Qui, il tipo Vector<3>::typeè equivalente a Matrix<3, 1>.


45
Oh fantastico, non avevo visto questa parte di C ++ 0x e ho parlato di dattiloscritti modellati per un po '... suppongo che dovrei avere una lettura più approfondita della bozza finale.
Matthieu M.

2
I costruttori ereditari renderanno la soluzione originale del PO una soluzione più praticabile?
StackedCrooked

2
@StackedCrooked: dipende dai suoi obiettivi. Evito l'ereditarietà quando la composizione farà (e sì, ereditare i costruttori renderà entrambi più facili), ma evito anche la composizione quando un typedef lo farà.
GManNickG,

1
l'utilizzo non supporta la specializzazione se non sbaglio, quindi la seconda opzione è ancora utile in molti casi.
Utkarsh Bhardwaj,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.