标准库实现可以专门化标准类型吗
Can a standard library implementation specialize standard types?
例如,为了论证起见,我们假设为积分类型的向量找到了一个更高效的(存储,对其进行操作(实现(与通用向量实现相比(。一个符合标准的图书馆能做一些类似的事情吗:
template <class T, class A, class Enable = void>
class vector { ... };
template <class T>
class vector<T, A, std::enable_if_t<std::is_integral<T>::value>> { ... };
我认为这将是非法的,因为额外的模板参数。
但是,编译器的一点魔力是什么呢?(除了额外的实现工作之外(是否允许这样的东西:
vector<integral_type, A>
被内部映射到class vector_integral<T, A>
,而- 要内部映射到
class vector<T, A>
的vector<anything_else, A>
-这显然与标准中明确提到的专业化无关,比如std::vector<bool>
-专业化显然具有相同的界面和可观察的行为。
-让我们忽略concepts
,因为它们还不是标准的。除非你有一些事实。
-这是一个纯粹的学术问题(阅读个人好奇心(。
只要标准库实现符合标准发布的保证,就允许进行专门化。这些保证显然包括增长复杂性、接口功能,以及某些类的数据内部布局。
据我所知,vector<bool>
专业化包含在标准中,因为它的内部数据布局不同于通用的vector<T>
库类,因此它需要得到标准的特别允许。
standtard明确表示17.5.1.4广告7:
库子句中指定的复杂性要求是上限,提供更好复杂性保证的实现满足这些要求。
相关文章:
- 编译标准库类型
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- 标准库类型的赋值运算符的引用限定符
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 根据C++标准的定义实现"is_similar"类型特征
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 为什么使用标准类型作为模板参数?
- 对标准类型使用原子操作
- 如何定义从标准类型到用户定义类型的转换?
- 自定义和标准类型的数学函数的统一接口
- 使用标准类型的动态类型信息实例化标识符
- 如何切换通过C 标准类型特征传递的值
- 为标准C++类型定义空/空值
- 两个模板函数用于两种标准类型
- 删除左值,保留左值引用(标准类型特征可用?)
- <stdint.h>还是标准类型?
- c++标准类型扩展
- 标准库实现可以专门化标准类型吗
- stint .h中的c++标准类型大小