2010-10-20 3 views
56

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

ответ

45

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

+4

+1 за отсутствие магии. Несмотря на это, нет ли каких-либо черт (например, в стандартной библиотеке C++ 0x), которые нельзя надежно определить, используя только язык, и для чего нужна специальная «магическая» помощь от компилятора? – UncleBens

+0

@UncleBens: Я не знаю, какие черты C++ 0x определяет, но я уверен, что таких признаков не существует до C++ 0x. –

+2

Это не * сейчас * волшебство, работающее внутри ['std :: basic_type'] (http://en.cppreference.com/w/cpp/types/underlying_type)? – Wolf

38

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

+5

+1 для эффективного объединения теории и реализации. –

Смежные вопросы