C ++中的特征封装了一系列操作,这些操作允许算法或数据结构使用与其实例化的类型的操作符。 char_traits
是分组string
和文件所需函数的示例。
但并非所有特质在他们的名字中都有“特质”,对吗?我想起了numeric_limits
。这也是“特质”吗?即使没有名称“特质”吗?
那么,是否有其他模板可以/应该被视为“特征”?除了我发现的例子:
allocator_traits
如何获得记忆pointer_traits
如何间接访问对象type_traits
元编程char_taits
表示符号序列iterator_traits
如何向前,向后和元素regex_traits
for ... regexes。我想,我要问的是,是否有纯粹的定义的特征?
我特别不确定的一些事情是:
numeric_limits
<chrono>
自定义“traits”,[20.11.4],即duration_values
hash<>
可以被认为是一种特质吗?更新:究竟是什么让特质成为一种特质似乎在细节上有点争议。也许可以回答另一个问题:是否有一个全面的列表,哪些类似特征的类对C ++ 0x来说是新的,哪些已经在C ++ 03中了?也许有人知道到某个地方的链接?
答案 0 :(得分:10)
这是一个按标准划分的性状的尝试列表。我很容易忽略一些。
新的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
答案 1 :(得分:8)
对于其他人,我无法评论,但有疑问时:
将特征想象成一个主要目的是携带的小物体 另一个对象或算法用来确定“政策”的信息 或“实施细节”。 - Bjarne Stroustrup
更新:只是为霍华德提供的广泛名单做出我的小贡献:
我错误地认为TR1的类型特征和正则表达式特征部分在技术上不是C ++ 0x中新特征束的一部分(即使新的标准已经大大扩展了类型特征)。 请参阅霍华德的评论和对此的澄清。
答案 2 :(得分:4)
(类型)特征是泛型编程中的一个简单的元函数。它采用一种类型,并返回一组描述该类型某些方面的值,函数和元函数。
这意味着特征是一个C ++类模板。例如,std::forward_iterator_tag
等迭代器基类不是特征。
备注 - 特征中的某些值本质上可以是布尔值。由于C ++模板限制,特征值不能是浮点类型。但是,traits也可以包含函数,这些函数对返回类型没有限制。
纯粹的特质类只包含静态成员;没有相关的实例数据。因此,它们也不包含构造函数。这种“纯粹”的区别允许我们将类似std::vector<T>
的类描述为非纯粹的特质类:它们实际上是它们自己的特征类。
答案 3 :(得分:1)
我真正喜欢的那个与新的枚举类类型相关的是
underlying_type :: type,它为您提供枚举类
的存储说明符的类型enum class My_Enum : unsigned int { ... }
underlying_type<My_Enum>::type -> unsigned int
在枚举转换和序列化中非常有用。