Какие "черты" используются/определены в стандарте С++ 0x
Характеристика в С++ инкапсулирует семейство операций, которые позволяют алгоритму или структуре данных работать с тем типом, с которым он создается. char_traits
- пример группировки string
- и требуемых файлов функций.
Но не все черты имеют "черту" в их имени, верно? numeric_limits
приходит на ум. Это тоже "черта" ? Даже без названия "черта" в нем?
Итак, существуют ли другие шаблоны, которые можно/следует считать "чертой"?. Помимо примеров, которые я нашел:
-
allocator_traits
как получить память
-
pointer_traits
как косвенно получить доступ к объекту
-
type_traits
метапрограммирование
-
char_taits
для последовательности символов
-
iterator_traits
как двигаться вперед, назад и к элементу
-
regex_traits
для... регулярных выражений.
Я думаю, что я тоже спрашиваю, есть ли чистое определение для черт?
Некоторые вещи, о которых я особенно не уверен, следующие:
-
numeric_limits
, упомянутый выше
-
<chrono>
"характеристики" настройки [20.11.4], т.е. duration_values
- как насчет Хэшинга? Может ли функтор
hash<>
считаться признаком?
- Если это так, не все требования "черты", например "CopyAssignable" и т.д.
- И тогда, заброшенные "Концепции" - это конечная "черта" - определение?
Обновление: Вопрос о том, что именно делает черту признаком, кажется немного противоречивым в деталях. Может быть, на другой вопрос можно ответить: Есть ли исчерпывающий список, который из классов, подобных черту, является новым для С++ 0x, а какие уже были в С++ 03? Возможно, кто-то знает ссылки куда-нибудь?
Ответы
Ответ 1
- * numeric_limits * определенно представляет набор признаков для числовых типов.
- все требования, такие как "CopyAssignable" и т.д., действительно являются чертами, см. этот документ по чертам
Для остальных я не могу комментировать, но когда вы сомневаетесь:
Подумайте о черте как о маленьком объекте, главной целью которого является перенос информация, используемая другим объектом или алгоритмом для определения "политики", или "детали реализации". - Бьярне Страуструп
Обновление:, чтобы внести небольшой вклад в обширный список, предоставленный Говардом:
- связанные с временем traites
- регулярные выражения
Я ошибался под впечатлением, что черты типа и regex traits, входящие в состав TR1, технически не являются частью нового набора признаков в С++ 0x ( хотя характерные черты были значительно расширены новым новым стандартом).
См. Комментарий Говарда и разъяснения по этому поводу.
Ответ 2
Вот пример списка признаков, разделенных стандартом. Я мог бы легко обойти некоторые из них.
новые свойства С++ 11:
is_error_code_enum
is_error_condition_enum
pointer_traits
allocator_traits
Just about everything in <type_traits>
treat_as_floating_point
duration_values
uses_allocator
regex_traits
Свойства С++ 98/03:
numeric_limits
char_traits
iterator_traits
Ответ 3
A (тип) - это простая мета-функция в общем программировании. Он принимает один тип и возвращает набор значений, функций и мета-функций, описывающих некоторые аспекты этого типа.
Это означает, что признак является шаблоном класса С++. Базовые классы итератора, такие как std::forward_iterator_tag
, например, не являются чертами.
Примечания -
Некоторые из значений в признаке могут быть логическими по своей природе. Из-за ограничений шаблона С++ значения признаков не могут иметь тип с плавающей запятой. Тем не менее, черты могут также содержать функции, и эти функции не имеют ограничений на тип возврата.
Чистые классы признаков содержат только статические члены; там нет простых данных экземпляра. По этой причине они также не содержат конструкторов. Это "чистое" различие позволяет нам описывать классы типа std::vector<T>
как нечистые классы признаков: они сами по себе являются их собственными классами.
Ответ 4
То, что я действительно люблю, что идет рука об руку с новыми типами классов enum, это
basic_type:: type, который дает вам тип спецификатора хранилища класса enum
enum class My_Enum : unsigned int { ... }
underlying_type<My_Enum>::type -> unsigned int
Очень полезно в преобразованиях enum и сериализации.