Я читаю " Эффективность Скотта Мейерса" C++. Он говорит о классах черт, я понял, что они мне нужны, чтобы определить тип объекта во время компиляции, но я не могу понять его объяснение того, что на самом деле делают эти классы? (с технической точки зрения)
Как работают классы черт и что они делают?
Ответ 1
Возможно, вы ожидаете какую-то магию, которая заставляет черты характера работать. В таком случае будьте разочарованы - нет волшебства. Типы типов определяются вручную для каждого типа. Например, рассмотрим iterator_traits
, который предоставляет typedefs (например, value_type
) для итераторов.
Используя их, вы можете написать
iterator_traits<vector<int>::iterator>::value_type x;
iterator_traits<int*>::value_type y;
// `x` and `y` have type int.
Но чтобы сделать эту работу, на самом деле есть явное определение где-нибудь в заголовке <iterator>
, который читает что-то вроде этого:
template <typename T>
struct iterator_traits<T*> {
typedef T value_type;
// …
};
Это частичная специализация типа iterator_traits
для типов формы T*
, то есть указатели какого-то общего типа.
В том же ключе iterator_traits
специализированы для других итераторов, например. typename vector<T>::iterator
.
Ответ 2
Классы классов не определяют тип объекта. Вместо этого они предоставляют дополнительную информацию о типе, как правило, путем определения typedefs или констант внутри признака.