Как работают классы черт и что они делают? - PullRequest
61 голосов
/ 20 октября 2010

Я читаю Скотта Мейерса Эффективный C ++ .Он говорит о классах черт, я понял, что они нужны мне для определения типа объекта во время компиляции, но я не могу понять его объяснение того, что на самом деле делают эти классы?(с технической точки зрения)

Ответы [ 2 ]

49 голосов
/ 20 октября 2010

Возможно, вы ожидаете какую-то магию, которая заставляет работать черты типа. В таком случае разочаровывайтесь - волшебства нет. Типовые черты вручную определены для каждого типа. Например, рассмотрим 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.

42 голосов
/ 20 октября 2010

Классы черт не определяют тип объекта. Вместо этого они предоставляют дополнительную информацию о типе, обычно определяя определения типа или константы внутри черты.

...