让我们看看非常基本的实现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正在做类似的事情,但我不知道如何做.
不,你不能形成对小于的任何东西的引用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[].
| 归档时间: |
|
| 查看次数: |
620 次 |
| 最近记录: |