在各种在线资源中,我读过std::vector<bool>
的自定义行为与其他类型的std :: vectors完全不同。
具体来说,它会压缩向量,使得每个索引代表一个位,而不是标准的bool类型(32位或无论多大)。
我的问题是,如何定义std :: vector来实现这个目标?
您是否可以覆盖模板类的现有行为,但仅限于特定的模板参数? (bool,在这种情况下)
这是否实现 没有 需要定义整个派生类并使用继承覆盖/重新定义行为?
答案 0 :(得分:4)
您可以覆盖模板类的现有行为,但仅限于特定的模板参数吗?
是。这称为 specialization ,是模板元编程的基本构建块之一。
对于第一个模板参数为std::vector
的情况, bool
部分专业,如下所示:
namespace std {
template<class T, class Alloc = std::allocator<T>>
class vector {
// normal vector stuff
};
template<class Alloc>
class vector<bool, Alloc> {
// special code for bools
};
}
您还可以完全专门化一个类模板。例如:
struct Bar;
template<class T>
struct Foo {
// standard stuff
};
template <>
struct Foo<Bar> {
// special stuff in case T is Bar
};
这可以用于许多有趣的方式。例如,您可以编写一个类型来检测另一个类型是否为std::vector
:
template<class T>
struct is_vector {
static const bool value = false;
};
template<class T, class A>
struct is_vector<std::vector<T, A>> {
static const bool value = true;
};