Ik ben de Effectieve C++van Scott Meyers aan het lezen . Hij heeft het over traits-klassen, ik begreep dat ik ze nodig heb om het type object te bepalen tijdens de compilatietijd, maar ik kan zijn uitleg over wat deze klassen eigenlijk doen niet begrijpen? (vanuit technisch oogpunt)
Antwoord 1, autoriteit 100%
Misschien verwacht je een soort magie die typeeigenschappen laat werken. Wees in dat geval teleurgesteld – er is geen magie. Typekenmerken worden voor elk type handmatiggedefinieerd. Denk bijvoorbeeld aan iterator_traits
, dat typedefs (bijv. value_type
) voor iterators levert.
Als je ze gebruikt, kun je schrijven
iterator_traits<vector<int>::iterator>::value_type x;
iterator_traits<int*>::value_type y;
// `x` and `y` have type int.
Maar om dit te laten werken, is er ergens een expliciete definitieergens in de <iterator>
-header, die ongeveer als volgt luidt:
template <typename T>
struct iterator_traits<T*> {
typedef T value_type;
// …
};
Dit is een gedeeltelijke specialisatievan het type iterator_traits
voor typen van de vorm T*
, dwz verwijzingen van een of ander generiek type.
p>
In dezelfde geest zijn iterator_traits
gespecialiseerd voor andere iterators, b.v. typename vector<T>::iterator
.
Antwoord 2, autoriteit 80%
Kenmerkenklassen bepalen niethet type object. In plaats daarvan geven ze aanvullende informatie over een type, meestal door typedefs of constanten binnen de eigenschap te definiëren.