2012-05-16 10 views
5

Nel this question l'OP ha richiesto una soluzione al modello typedef che non è possibile in C++. Il PO ha inoltre presentato una soluzione di se stessi, ma non gli piaceva:Perché il modello digita un problema in C++ (non C++ 11)

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

// Problem - will not compile 
typedef Matrix<N,1> Vector<N>; 

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

La mia domanda è, quale vantaggio fa il Helper::typesolution ci danno sopra la soluzione del PO (supponendo che queste classi non sono mai destinati ad essere utilizzati da un puntatore base o new 'd come tale)? Una classe vuota non dovrebbe portare a spese generali nel rilascio (o lo fa?). L'unico svantaggio che posso vedere è che nelle build di debug dovrai espandere la classe base durante il debug.

EDIT: Oltre alla risposta selezionata, vedere la risposta di Dani che ha suggerito che la versione ereditata richiederebbe la definizione dei costruttori, il che costituisce un ulteriore inconveniente.

+0

Se nient'altro, 'Helper :: type' è in realtà il tipo giusto. È passato un po 'di tempo dall'ultima volta che ho approfondito queste cose, ma l'IIRC presenta alcuni problemi delicati con la deduzione del tipo e simili. – Hurkyl

risposta

7

Il punto di typedef consiste nel definire un alias di tipo. Una sottoclasse non è un alias di tipo - è un nuovo tipo.

Per esempio, immaginate un po 'di funzione di libreria

template<size_t N, size_t M> 
Matrix<N, M> * createMatrix(); 

Ora con il tipo di aiuto

Vector<3>::type * var = createMatrix<3, 1>(); 

è legale.
Con eredità

Vector<3> * var = createMatrix<3, 1>(); 

non è.

+0

Certo, ma stiamo creando comunque nuovi tipi (ogni volta che gli argomenti del template sono diversi), quindi alla fine, c'è davvero una differenza? – Samaursa

+0

@Samaursa vedi la mia modifica. –

7

È perché i costruttori non sono ereditati (e in C++ 11 non di default). Quindi è necessario copiare tutti i costrutti non predefiniti, anche se si chiama semplicemente il costruttore della classe base nell'implementazione.

+0

aha! Questo mi è sfuggito per qualsiasi ragione! Perfetto grazie. – Samaursa

3

A parte tutti i gusti sulla sintassi (che può essere soggettiva) la differenza principale è che, per disonestà, il vettore è in realtà un altro tipo che decade in matrice, mentre usa un helper contenente un typedef, vector è un alias di matrice (almeno per ciò che si applica la specializzazione parziale).

La differenza richiede vettore di ridefinire costruttori (che non sono ereditate), o alcuni potenziali insidie ​​in caso di operazioni definite in termini di modello di specializzazione (con typedef, non potranno mai essere visti come "differnet")

Problemi correlati