c ++避免vector <bool> instantiation </bool>

时间:2014-12-10 22:51:29

标签: c++ templates vector stl

我在std :: vector上有一些类模板:

template<typename T>
class MyClass{
public:
    // public methods;
private:
    std::vector<T> buffer_;
    // private methods and members
};

这是我班级的简化版。内部vector在这里用作排序缓冲区,不同的IO操作,依赖于其单个内存块实现,例如fstreams自定义缓冲区和仅在运行时已知的缓冲区大小。 一切都很好,但vector<bool>实例绝对不适合这样的目的。我希望在班上有vector<char>vector<uint8_t>而不是vector<bool>个实例。此外,我不能使用其他库,如boost,standart库。

有解决方法吗?

3 个答案:

答案 0 :(得分:4)

创建一个辅助类来确定向量的值类型(此代码使用C ++ 11,但只能使用C ++ 98轻松重写):

template<typename T>
struct VectorValueType {
    using type = T;
};

template<>
struct VectorValueType<bool> {
    using type = char;
};

template<typename T>
using VectorValueType_t = typename VectorValueType<T>::type;

template<typename T>
class MyClass{
private:
    std::vector<VectorValueType_t<T>> buffer_;
};

答案 1 :(得分:2)

使用包装器子类,如下所示:

template<typename T>
struct sub_vector: public vector<T> {};

template<>
struct sub_vector<bool>: public vector<char> {};

然后只使用它代替vector

答案 2 :(得分:-1)

对T = bool类型使用模板特化。 然后对于除bool之外的所有类型,使用vector。

template <typename T>
class MyClass
{
private:
    std::vector<T> buffer_;
};

template <>
class MyClass<bool>
{
private:
    std::vector<char> buffer_;
};

您还需要专门化您要添加的每个成员函数。