Какие "признаки" используются / определяются в стандарте C++0x


Признак в C++ инкапсулирует семейство операций, которые позволяют алгоритму или структуре данных работать с тем типом, с которым он создан. char_traits являются примером группировки string-и файл-обязательных функций.

Но не все признаки имеют "признак" в своем названии, верно? numeric_limits приходит на ум. Это тоже "черта характера"? Даже без названия "черта" в нем?

Итак, существуют ли другие шаблоны, которые можно/нужно считать "чертой"? Кроме того примеры, которые я нашел:

  • allocator_traits Как получить память
  • pointer_traits Как получить косвенный доступ к объекту
  • type_traits метапрограммирование
  • char_taits для последовательности символов
  • iterator_traits Как пройти вперед, назад и к элементу
  • regex_traits ибо... регулярные выражения.

Я думаю, что я тоже спрашиваю, есть личистое определение для черт?

Некоторые вещи, в которых я особенно не уверен:

  • numeric_limits упомянутые выше
  • <chrono>S настройка "черт", [20.11.4], т. е. duration_values
  • а как насчет хеширования? Можно ли рассматривать функтор hash<> как признак?
  • Если это так, не являются ли все требования "признаками", такими как "CopyAssignable" и т. д.?
  • И затем, являются ли оставленные " понятия "окончательным"признаком" -определением?

Обновление: вопрос, что именно делает черту чертой, кажется немного спорным в деталях. Может быть еще один вопрос можно было бы ответить: существует ли полный список, какие из классов, подобных признакам, являются новыми для C++0x, а какие уже были в C++03? может быть, кто-то знает о ссылке куда-то?

4 24

4 ответа:

  • * numeric_limits * определенно представляет набор признаков для числовых типов.
  • все требования, такие как" CopyAssignable " и т. д. действительно ли черты см. эту статью о чертах

    Для остальных я не могу комментировать, но когда сомневаюсь:

    Думайте о черте как о маленьком предмете, главная цель которого-нести информация, используемая другим объектом или алгоритмом для определения " политики" или "детали реализации". - Бьерн Страуструп

    обновление: чтобы просто внести свой небольшой вклад в обширный список, предоставленный Говардом:

  • связанные со временем черты
  • признаки регулярных выражений

Я ошибочно полагал, чтотиповые признаки ирегулярные признаки , являющиеся частью TR1, технически не входят в группу новых признаков в C++0x(хотя признаки типа были значительно расширены новым стандартом). Смотрите комментарий Говарда и уточнение по этому поводу.

Вот примерный список признаков, разделенных по стандарту. Я вполне мог проглядеть некоторые из них.

Новые черты C++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

C++98/03 черты:

numeric_limits
char_traits
iterator_traits

Признак (типа)-это простая мета-функция в общем программировании. Он принимает один тип и возвращает набор значений, функций и мета-функций, описывающих некоторые аспекты этого типа.

Это означает, что признак является шаблоном класса C++. Например, базовые классы итераторов, такие как std::forward_iterator_tag, не являются признаками.

примечания - Некоторые значения признака могут быть булевыми по своей природе. Из-за ограничений шаблона C++ значения признаков не могут иметь тип с плавающей запятой. Однако черты характера может также содержать функции,и эти функции не имеют ограничений на тип возвращаемого значения.

Чистые классы признаков содержат только статические члены; просто нет соответствующих данных экземпляра. По этой причине они также не содержат конструкторов. Это" чистое " различие позволяет нам описывать классы, подобные std::vector<T>, Как не-чистые классы признаков: они, по сути, являются их собственными классами признаков.

Тот, который я действительно люблю, который идет рука об руку с новыми типами классов enum, является

Underlying_type:: type, который дает вам тип спецификатора хранилища класса enum

enum class My_Enum : unsigned int { ... }

underlying_type<My_Enum>::type -> unsigned int

Очень полезно при перечислении преобразований и сериализации.