Какие "признаки" используются / определяются в стандарте 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 ответа:
- * 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
Очень полезно при перечислении преобразований и сериализации.