什么样的;“特征”;在C+中使用/定义+;0x标准 C++中的一个特性封装了一系列操作,允许算法或数据结构与实例化的类型进行操作。code>char\u traits是分组string和文件所需函数的示例

什么样的;“特征”;在C+中使用/定义+;0x标准 C++中的一个特性封装了一系列操作,允许算法或数据结构与实例化的类型进行操作。code>char\u traits是分组string和文件所需函数的示例,c++,c++11,traits,typetraits,C++,C++11,Traits,Typetraits,但并不是所有的特质都有“特质”的名字,对吗数值限制浮现在脑海中。这也是一种“特质”吗?即使没有“特质”这个名字 那么,除了我发现的示例之外,还有其他模板可以/应该被视为“特质”: allocator\u traits如何获取内存 指针特性如何间接访问对象 type\u traits元编程 符号序列的字符 iterator\u traits如何前进、后退和返回元素 regex\u traits用于。。。正则表达式 我想,我也在问,特质是否有一个纯粹的定义 我特别不确定的是: 上述数值限制 s

但并不是所有的特质都有“特质”的名字,对吗<代码>数值限制浮现在脑海中。这也是一种“特质”吗?即使没有“特质”这个名字

那么,除了我发现的示例之外,还有其他模板可以/应该被视为“特质”

  • allocator\u traits
    如何获取内存
  • 指针特性
    如何间接访问对象
  • type\u traits
    元编程
  • 符号序列的字符
  • iterator\u traits
    如何前进、后退和返回元素
  • regex\u traits
    用于。。。正则表达式
我想,我也在问,特质是否有一个纯粹的定义

我特别不确定的是:

  • 上述数值限制
  • s定制“特征”[20.11.4],即
    duration\u值
  • 散列呢?函子
    hash
    可以被认为是一种特征吗
  • 如果是这样的话,难道不是所有的需求都是“特征”,比如“可复制的”,等等吗
  • 那么,被抛弃的“概念”是最终的“特质”定义吗
更新:到底是什么让特质成为特质的问题在细节上似乎有点争议。也许可以回答另一个问题:是否有一个全面的列表,列出哪些trait-like类对C++0x是新的,哪些类已经在C++03中出现过?也许有人知道某个地方的链接?

  • *numeric_limits*明确表示数字类型的一组特征。
  • 所有的要求,如“可复制”等,都是可以理解的

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

    把一个特征想象成一个小物体,它的主要目的是携带 其他对象或算法用于确定“策略”的信息 或“实施细节”。-比亚恩·斯特罗斯图普

    更新:为了对霍华德提供的广泛列表做出一点贡献:

  • 时间相关叛徒
  • 正则特征
我错误地认为TR1中的类型特征和正则表达式特征在技术上不是C++0x中的新特征群的一部分(尽管即将到来的新标准已经大大扩展了类型特征)。 请参阅Howard的评论和澄清。

A(type)trait是泛型编程中的一个简单元函数。它采用一种类型并返回一组值、函数和元函数,这些值、函数和元函数描述了该类型的某些方面

这意味着一个特性是C++类模板。例如,

std::forward\u iterator\u tag
等迭代器基类不是特征

注- 特征中的某些值本质上可能是布尔值。由于C++模板限制,特征值不能是浮点类型。但是,traits也可以包含函数,这些函数对返回类型没有限制


纯特征类只包含静态成员;没有相关的实例数据。因此,它们也不包含构造函数。这种“纯”的区别使我们能够将像std::vector这样的类描述为非纯特征类:实际上它们是它们自己的特征类。

这里是一个按标准划分的特征列表。我可以很容易地忽略一些

新的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
numeric_limits
char_traits
iterator_traits

我真正喜欢与新的枚举类类型一起使用的是

底层_type::type,它为您提供枚举类的存储说明符的类型

enum class My_Enum : unsigned int { ... }

underlying_type<My_Enum>::type -> unsigned int
enum类My_enum:unsigned int{…}
基础类型::类型->无符号整数

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

这应该是CW,因为有许多可能的“正确”答案。我猜这个选项已经不存在了?无论如何,iostreams facet是trait的一种形式。我不认为
hash
被恰当地视为trait类,因为它不仅仅提供关于类的编译时信息。这个定义如何:“一个没有非静态成员的模板类,其静态成员只依赖于模板参数。”我要说的是,
numeric\u limits
并不是严格意义上的trait类,因为它的值并不都是编译时的静态常量或
constexpr
——比如
max()
这是一个运行时值。@Kerrek SB:Nor
char\u traits
严格来说是编译时:
length
compare
也必须在运行时进行计算。顾名思义,它被认为是一个trait类。我认为
numeric\u limits
是一个非常有效的trait类。它没有状态,只提供有关类型的信息。事实上,它的一些信息是以静态函数的形式存在的,这并不意味着它不是traits类,而是策略?嗯,这也是Alexandrescu的观点吗?我认为特质是政策类的一个特殊情况。Alexandrescu在书中提到它们是一种通用编程技术,“Traits是一种通用编程技术,它允许根据类型做出编译时决策,就像您根据值做出运行时决策一样。”但他并没有明确提到特质是策略,我将它们分开的方式是说特质是无状态的,只是给你一个类型的信息。策略类可能具有state,因此您可以对同一类型使用不同的策略。此外,特征往往是非常小的“原始”类型、值和功能(