如何编写返回对单个位的引用的bool&operator [](int index)

Jar*_*łka 1 c++ operators

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

struct Bitset {
    bool mask[32];

    bool& operator[] (int index) {
        return mask[index];
    }
};
Run Code Online (Sandbox Code Playgroud)

现在我可以写了

Bitset bitset;
bitset[0] = 1;
std::cout << bitset[0] << "\n";
Run Code Online (Sandbox Code Playgroud)

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

struct Bitset {
    unsigned int mask;

    bool& operator[] (int index) {
        // ??
    }
};
Run Code Online (Sandbox Code Playgroud)

是否有可能bool& operator[] (int index)用这样的规范写?我认为std::bitset正在做类似的事情,但我不知道如何做.

Mik*_*our 9

不,你不能形成对小于的任何东西的引用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
Run Code Online (Sandbox Code Playgroud)

如评论中所述,您可能还需要一些复合赋值操作来更全面地模拟引用.您可能还需要一个包含const引用而没有赋值运算符的单独类型,以从const重载返回operator[].

  • 这通常就足够了(而且我可能会这么做),但是如果你真的希望它模仿`bool&`,你必须支持`| =`,`&=`...甚至`/ =`(这是愚蠢的,但`bool`支持它). (3认同)

Ben*_*igt 5

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

您将不得不返回"智能引用"对象而不是原始引用.