web-dev-qa-db-fra.com

Comment fonctionnent les classes de traits et que font-elles?

Je lis C++ efficace de Scott Meyers . Il parle de classes de traits, j'ai compris que j'en ai besoin pour déterminer le type d'objet pendant la compilation, mais je ne comprends pas son explication sur ce que font réellement ces classes? (du point de vue technique)

62
rookie

Peut-être vous attendez-vous à une sorte de magie qui fait fonctionner les traits de type. Dans ce cas, soyez déçu - il n'y a pas de magie. Les traits de type sont manuellement définis pour chaque type. Par exemple, considérez iterator_traits, qui fournit des typedefs (par exemple value_type) pour les itérateurs.

En les utilisant, vous pouvez écrire

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

Mais pour que cela fonctionne, il y a en fait un définition explicite quelque part dans le <iterator> header, qui lit quelque chose comme ceci:

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

Il s'agit d'un spécialisation partielle du iterator_traits type pour les types du formulaire T*, c'est-à-dire des pointeurs d'un type générique.

Dans la même veine, iterator_traits sont spécialisés pour d'autres itérateurs, par exemple typename vector<T>::iterator.

50
Konrad Rudolph

Les classes de traits déterminent pas le type de l'objet. Au lieu de cela, ils fournissent des informations supplémentaires sur un type, généralement en définissant des typedefs ou des constantes à l'intérieur du trait.

43
fredoverflow