Подтвердить что ты не робот

Какие "черты" используются/определены в стандарте С++ 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? Возможно, кто-то знает ссылки куда-нибудь?

4b9b3361

Ответ 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 и сериализации.