如何声明/定义std :: vector <bool>?</bool>

时间:2014-11-12 01:47:01

标签: c++ oop templates vector std

在各种在线资源中,我读过std::vector<bool>的自定义行为与其他类型的std :: vectors完全不同。

具体来说,它会压缩向量,使得每个索引代表一个位,而不是标准的bool类型(32位或无论多大)。

我的问题是,如何定义std :: vector来实现这个目标? 您是否可以覆盖模板类的现有行为,但仅限于特定的模板参数? (bool,在这种情况下)
这是否实现 没有 需要定义整个派生类并使用继承覆盖/重新定义行为?

1 个答案:

答案 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;
};