2010-10-20 14 views
56

Sto leggendo lo Effective C++ di Scott Meyers. Sta parlando di classi di tratti, ho capito che ho bisogno di loro per determinare il tipo di oggetto durante il tempo di compilazione, ma non riesco a capire la sua spiegazione su ciò che effettivamente fanno queste classi? (dal punto di vista tecnico)come funzionano le classi di caratteri?

risposta

45

Forse ti stai aspettando un qualche tipo di magia che faccia funzionare i tratti del carattere. In tal caso, sii deluso: non c'è magia. I tratti del tipo sono manualmente definiti per ciascun tipo. Ad esempio, considera iterator_traits, che fornisce typedef (ad esempio value_type) per gli iteratori.

Il loro utilizzo, è possibile scrivere

iterator_traits<vector<int>::iterator>::value_type x; 
iterator_traits<int*>::value_type y; 
// `x` and `y` have type int. 

Ma per fare questo lavoro, non v'è in realtà un esplicita definizione da qualche parte nel <iterator> intestazione, in cui si legge qualcosa di simile:

template <typename T> 
struct iterator_traits<T*> { 
    typedef T value_type; 
    // … 
}; 

Questa è una specializzazione parziale del del tipo iterator_traits per i tipi del modulo T*, ovvero i puntatori di qualche tipo generico.

Allo stesso modo, iterator_traits sono specializzati per altri iteratori, ad es. typename vector<T>::iterator.

+4

+1 per nessuna magia. Anche se, non ci sono alcuni tratti (ad esempio nella libreria standard C++ 0x) che non possono essere definiti in modo affidabile usando solo il linguaggio, e che hanno bisogno di aiuto speciale "magico" dal compilatore per funzionare? – UncleBens

+0

@UncleBens: non so quali tratti C++ 0x definisca, ma sono certo che non esistono tali caratteri prima di C++ 0x. –

+2

Non è * ora * una specie di magia che funziona in ['std :: underlying_type'] (http://en.cppreference.com/w/cpp/types/underlying_type)? – Wolf

38

Le classi di tratti fanno non determinare il tipo dell'oggetto. Al contrario, forniscono informazioni aggiuntive su un tipo, in genere definendo typedef o costanti all'interno del tratto.

+5

+1 per combinare efficacemente teoria e implementazione. –

Problemi correlati