How do traits classes work and what do they do?
Asked Answered
R

2

73

I'm reading Scott Meyers' Effective C++. He is talking about traits classes, I understood that I need them to determine the type of the object during compilation time, but I can't understand his explanation about what these classes actually do? (from technical point of view)

Relative answered 20/10, 2010 at 15:50 Comment(0)
O
58

Perhaps you’re expecting some kind of magic that makes type traits work. In that case, be disappointed – there is no magic. Type traits are manually defined for each type. For example, consider iterator_traits, which provides typedefs (e.g. value_type) for iterators.

Using them, you can write

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

But to make this work, there is actually an explicit definition somewhere in the <iterator> header, which reads something like this:

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

This is a partial specialization of the iterator_traits type for types of the form T*, i.e. pointers of some generic type.

In the same vein, iterator_traits are specialized for other iterators, e.g. typename vector<T>::iterator.

Open answered 20/10, 2010 at 18:18 Comment(6)
+1 for no magic. Even though, aren't there some traits (e.g in C++0x standard library) that can't be reliably defined using only the language, and that need special "magical" help from the compiler to work?Chrono
@UncleBens: I don’t know which traits C++0x defines but I’m certain that no such traits exist before C++0x.Open
Isn't now a kind of magic working within std::underlying_type?Caveat
@Caveat C++11 added a few traits which cannot be implemented on the user side, they need compiler support. And, yes, std::underlying_type is one of them.Open
When I read your there is no magic, I was wondering whether this detail would matter for this question...Caveat
@Caveat Well the answer was written long before C++11 came out.Open
F
44

Traits classes do not determine the type of the object. Instead, they provide additional information about a type, typically by defining typedefs or constants inside the trait.

Featherston answered 20/10, 2010 at 15:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.