1

让我们看一下非常基本的实现Bitset

struct Bitset {
    bool mask[32];

    bool& operator[] (int index) {
        return mask[index];
    }
};

现在我可以写了

Bitset bitset;
bitset[0] = 1;
std::cout << bitset[0] << "\n";

有可能的优化。我可以使用unsigned int而不是bool mask[32].

struct Bitset {
    unsigned int mask;

    bool& operator[] (int index) {
        // ??
    }
};

可以bool& operator[] (int index)用这样的规范写吗?我认为std::bitset正在做类似的事情,但我不知道怎么做。

4

2 回答 2

10

不,您不能形成对任何小于char.

相反,您可以返回一个可转换为bool、支持赋值并知道要读取和写入的位的对象,如下所示:

class bit_proxy
{
public:
    bit_proxy(unsigned & mask, unsigned bit) : mask(mask), index(index) {}

    operator bool() const {return mask & (1 << index);}
    void operator=(bool bit) {mask = (mask & ~(bit << index)) | (bit << index);}

private:
    unsigned & mask;
    unsigned index;
};

bit_proxy bitset::operator[](unsigned index)
{
    return bit_proxy(mask, index);
}

my_bitmask[3] = true;     // sets bit 3
bool bit = my_bitmask[3]; // gets bit 3

如评论中所述,您可能还需要一些复合赋值操作来更全面地模拟引用。您可能还需要一个单独的类型,包含const引用和无赋值运算符,以constoperator[].

于 2012-04-13T16:54:20.537 回答
5

不,这是不可能的。变量内的位没有唯一的地址,因此您不能形成指针或对各个位的引用。

您将不得不返回一个“智能引用”对象而不是原始引用。

于 2012-04-13T16:52:18.897 回答