在C ++ 0x标准中使用/定义了什么样的“特征”

时间:2011-07-16 16:16:16

标签: c++ c++11 traits typetraits

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
  • Hashing怎么样?仿函数hash<>可以被认为是一种特质吗?
  • 如果是这样的话,并非所有要求都是“特征”,比如“CopyAssignable”等?
  • 然后,废弃的“概念”是最终的“特质” - 定义吗?

更新:究竟是什么让特质成为一种特质似乎在细节上有点争议。也许可以回答另一个问题:是否有一个全面的列表,哪些类似特征的类对C ++ 0x来说是新的,哪些已经在C ++ 03中了?也许有人知道到某个地方的链接?

4 个答案:

答案 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)

  • * numeric_limits *肯定代表数字类型的一组特征。
  • “CopyAssignable”等所有要求确实是特征this paper on traits

    对于其他人,我无法评论,但有疑问时:

      

    将特征想象成一个主要目的是携带的小物体   另一个对象或算法用来确定“政策”的信息   或“实施细节”。 - 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

在枚举转换和序列化中非常有用。