Какие «черты» используются / определены в стандарте C ++ 0x - PullRequest
24 голосов
/ 16 июля 2011

Черта в 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 ]

10 голосов
/ 31 июля 2011

Вот список попыток черт, разделенных на стандартные.Я мог бы легко не заметить некоторые.

новые черты 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
8 голосов
/ 16 июля 2011

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

    Что касается других, я не могу комментировать, но в случае сомнений:

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

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

  • связанные со временем черты
  • regexчерты

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

4 голосов
/ 18 июля 2011

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

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

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

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

1 голос
/ 04 августа 2011

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

ring_type :: type, который дает тип спецификатора хранения класса enum

enum class My_Enum : unsigned int { ... }

underlying_type<My_Enum>::type -> unsigned int

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

...