【问题标题】:How to implement an array of bits in C++如何在 C++ 中实现位数组
【发布时间】:2016-04-12 18:54:44
【问题描述】:

我正在尝试编写一个包含位数组(作为成员变量)的 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;
};

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

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

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

std::bitset 是适合此任务的工具吗?如果是这样,我该如何编写setter函数?如果没有,我可以用什么代替? (我仍然希望它实际存储为位,std::vector&lt;bool&gt; 似乎不太正确,因为我希望在编译时严格固定数组大小)。

【问题讨论】:

  • 我不明白。 std::bitsethas an operator[],那你为什么要重新发明轮子?
  • 似乎错误是不言自明的。添加typename before...。那么你为什么不尝试这样做呢?
  • @ThomasMatthews:可能是演示问题的大型类的最小版本。
  • @ThomasMatthews 正如另一条评论中指出的那样,我试图从一个更大的课程中举一个最小的例子。
  • @NowhereMan 当然,我确实尝试过这样做,但它产生了许多新错误,似乎将我引向了错误的方向。

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


【解决方案1】:

您可以只返回一个std::bitset&lt;N&gt;::reference,如下所示:

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&lt;size_t K&gt;,因为您仍然可以访问原始模板参数 N,并且在任何情况下您都不希望 N 和您的 K 不同。

您需要在函数的返回类型之前加上typename 来告诉编译器::reference 是一个类型而不是一个值。

例如:

struct Foo{
   typedef int reference;
};

struct Bar{
    static int reference;
};

这里Foo::reference 是一个类型,但Bar::reference 是一个变量,如果在返回类型之前没有typename,编译器会报错,因为std::bitset&lt;N&gt;::reference 可能是一个变量。 (编译器应该有它需要的所有信息来确定它不是一个值,但出于某种原因它仍然是必需的)。

【讨论】:

  • 很好的答案。非常感谢你解释得这么清楚。
猜你喜欢
  • 2011-04-14
  • 2011-08-25
  • 2011-05-21
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 2011-03-17
相关资源
最近更新 更多