【发布时间】:2011-10-06 19:32:23
【问题描述】:
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”等?
- 那么,被抛弃的“概念”是最终的“特征”——定义吗?
更新:究竟是什么让一个特质成为特质这个问题在细节上似乎有点争议。也许可以回答另一个问题:是否有一个完整的列表,哪些类 trait-like 类是 C++0x 新的,哪些已经在 C++03 中? 也许有人知道到某个地方的链接?
【问题讨论】:
-
这应该是 CW,因为有许多可能的“正确”答案。我猜那个选项不再存在?无论如何,iostream 方面是 trait 的一种形式。
-
我不认为
hash<>被认为是一个特征类,因为它不仅仅提供关于类的编译时信息。这个定义怎么样:“没有非静态成员的模板类,其静态成员仅依赖于模板参数。” -
我会说
numeric_limits严格来说并不是一个特征类,因为它的值并不都是编译时静态常量或constexpr——你有像max()这样的东西是一个运行时值。 -
@Kerrek SB:
char_traits也不是严格的编译时:length或compare也必须在运行时进行评估。顾名思义,它被认为是一个 trait 类。 -
我认为
numeric_limits是一个完全有效的特征类。它没有状态,只是提供有关类型的信息。它的一些信息以静态函数的形式存在这一事实并没有使它不再是一个特征类,IMO
标签: c++ c++11 traits typetraits