如何在C ++中实现一个位数组

时间:2016-04-12 18:54:44

标签: c++ arrays bitwise-operators std-bitset

我正在尝试编写一个包含位数组(作为成员变量)的C ++模板类。位数组的大小在编译时是已知的,所以我真的希望它是std::bitset,但我很难将operator[]函数写入设置位。

例如,我希望我的班级能够开始这样的事情:

template<size_t N>
class bitvector
{
public:
    bool operator[](size_t i) const { return bits[i]; }
    bool& operator[](size_t i) { return bits[i]; }
private:
    std::bitset<N> bits;
};

getter工作正常。问题是std::bitset::operator[] setter函数返回std::bitset::reference(不是bool&),它本身就是模板化的。我对模板不太熟悉,但以下尝试失败了:

template<size_t K>
std::bitset<K>::reference operator[](size_t i) { return bits[i]; }

出现以下错误need 'typename' before 'std::bitset<K>::reference' because 'std::bitset<K>' is a dependent scope。我尝试了一些谷歌搜索,但无济于事。

std::bitset是否适合执行此任务?如果是这样,我该如何编写setter函数?如果没有,我可以使用什么呢? (我仍然希望它实际存储为位,而std::vector<bool>看起来并不正确,因为我希望在编译时严格修复数组大小。)

1 个答案:

答案 0 :(得分:3)

您可以按如下方式返回template<size_t N> class bitvector { public: bool operator[](size_t i) const { return bits[i]; } typename std::bitset<N>::reference operator[](size_t i) { return bits[i]; } private: std::bitset<N> bits; };

template<size_t K>

由于您仍然可以访问原始模板参数N,因此不需要额外的typename,在任何情况下您都不希望N和您的K不同。

在函数返回类型之前需要::reference告诉编译器struct Foo{ typedef int reference; }; struct Bar{ static int reference; }; 是一个类型而不是一个值。

例如:

Foo::reference

此处Bar::reference是一种类型,但typename是一个变量,在编译器将抱怨的返回类型之前没有std::bitset<N>::reference,因为{{1}}可能是{{1}}变量。 (编译器应该具有所需的所有信息,以确定它不是一个值,但出于某种原因它仍然是必需的。)