Hoe werken traits-lessen en wat doen ze?

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_traitsvoor typen van de vorm T*, dwz verwijzingen van een of ander generiek type.

p>

In dezelfde geest zijn iterator_traitsgespecialiseerd 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.

Other episodes