67 votes

Comment fonctionnent les classes de traits et à quoi servent-elles ?

Je suis en train de lire l'ouvrage de Scott Meyers C++ efficace . Il parle de classes de traits, j'ai compris que j'en ai besoin pour déterminer le type de l'objet lors de la compilation, mais je n'arrive pas à comprendre son explication sur ce que ces classes font réellement (d'un point de vue technique).

54voto

Konrad Rudolph Points 231505

Vous vous attendez peut-être à une sorte de magie qui ferait fonctionner les caractères typographiques. Dans ce cas, soyez déçu : il n'y a pas de magie. Les caractères de type sont manuellement définis pour chaque type. Par exemple, considérons iterator_traits qui fournit des définitions de types (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 une définition explicite quelque part dans le <iterator> qui se lit à peu près comme suit :

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

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

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

5 votes

+1 pour l'absence de magie. Cependant, n'y a-t-il pas des traits (par exemple dans la bibliothèque standard du C++0x) qui ne peuvent pas être définis de manière fiable en utilisant uniquement le langage, et qui ont besoin d'une aide "magique" spéciale de la part du compilateur pour fonctionner ?

0 votes

@UncleBens : Je ne sais pas quels traits C++0x définit, mais je suis certain qu'aucun trait de ce type n'existe avant C++0x.

2 votes

N'est-ce pas maintenant une sorte de magie qui opère à l'intérieur std::underlying_type ?

43voto

FredOverflow Points 88201

Les classes de traits font pas déterminer le type de l'objet. En revanche, 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X