2012-03-09 22 views
33
template<typename T> 
class Point 
{ 
public: 
    typedef T value_type; 
    ... 
}; 

Ho visto il codice sopra nello book, pp176.È sempre utile definire `value_type` quando definiamo un modello

Question1> È buona norma aggiungere sempre la definizione per value_type?

Question2> Dove verrà definito questo value_type?

Ad esempio:

Point<int>::value_type?

+8

+1 per l'acquisto di un libro C++ corretto, e quindi facendo una domanda ragionevole – Joe

+2

Triste che al giorno d'oggi è così raro. –

risposta

15

Non male avere uno, ma rende più solo senso per contenitori (come std::vector), come tutti i contenitori forniscono questo typedef e un'interfaccia uniforme per accedere ai valori contenuti (begin/end, front/back), anche se questo è diventato quasi obsoleto in C++ 11 con auto e decltype. È comunque più pulito dire some_template<typename container::value_type> ....

Questo a sua volta significa che possono essere utilizzati in modo intercambiabile in codice generico (il motivo principale per cui le cose sono state fatte in questo modo). Se ha senso per la tua classe Point sapere quali sono i valori contenuti, beh, avere quello typedef. Come ho detto, non fa male. Tuttavia, ho la sensazione che non abbia molto senso per quel particolare esempio.

5

È una buona pratica per scrivere le funzioni eseguite sui contenitori. Ad esempio, se ho scritto una funzione swap che accetta un contenitore (con modelli) e due indici da scambiare, potrei utilizzare la definizione value_type per definire una variabile temporanea.

template<typename T> 
void swap(T &container, int i, int j) { 
    typename T::value_type temp = container[i]; 
    container[i] = container[j]; 
    container[i] = temp; 
} 
+2

E in C++ 11, sarebbe 'auto'. :) Si noti che questo è un pessimo esempio di 'swap', ma uno adeguato per typedef nested 'value_type'. – Xeo

1

Direi solo se ha senso per il tipo. Ho incontrato problemi in cui value_type si intromette perché alcuni algoritmi generici presuppongono erroneamente che si tratti di un contenitore di qualche tipo (nel mio caso, mi sembra di ricordare che c'era un algoritmo in boost che presupponeva che shared_ptr fosse un container multi-contenitore a causa di value_type essendo presente).