标准库实现可以专用于标准类型吗?
问题描述:
例如,为了说明的缘故,我们假设找到了一个整型向量的更高效的(存储,操作)实现(与通用向量实现相比)。一个标准的遵守库可以做类似的事情:标准库实现可以专用于标准类型吗?
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>
而 -
vector<anything_else, A>
是内部映射到class vector<T, A>
。
- 这显然不是在标准中明确提到的专业化,像std::vector<bool>
- 专业化显然具有相同的接口和观察到的行为。
- 让我们忽略concepts
,因为他们还没有标准。除非你有一些事实。
- 这是一个纯学术问题(读个人的好奇心)。
答
只要标准库实现符合标准发布的保证,就可以进行专业化。这些保证显然包括增长复杂性,接口功能以及某些类别数据的内部布局。
据我所知,vector<bool>
专业化是因为其内部数据布局不同于通用的vector<T>
库类,因此需要标准明确允许专业化。
立场明确表示17.5.1.4广告。 7:
库条款中指定的复杂性要求是上限,而提供更好复杂性保证的实现满足要求。