对于以下两种情况,是否可以有operator[]
的两个定义?
My_bit_array[7] = true;
bool x = My_bit_array[0];
这很有用,因为读取一个字节并切换字节的8位之一(uint8_t
)是不同的。这两种情况需要两种不同的定义。
答案 0 :(得分:3)
这很简单。它应该使用代理对象来实现,就像在评论中已经提到的那样。我猜这样的事情是这样的:
#include <iostream>
#include <cstddef>
using namespace std;
struct proxy_obj;
struct my_bit_array
{
uint8_t bit_array_;
proxy_obj operator[](int n);
};
struct proxy_obj
{
my_bit_array& my_bit_array_;
int n_;
proxy_obj(my_bit_array& bit_array, int n)
: my_bit_array_(bit_array), n_(n) {}
proxy_obj& operator=(bool b)
{
uint8_t set_mask = 0x01 << n_;
if(b) my_bit_array_.bit_array_ |= set_mask;
else my_bit_array_.bit_array_ &= (~set_mask);
return *this;
}
operator bool(){ return my_bit_array_.bit_array_ & (0x01 << n_); }
};
proxy_obj my_bit_array::operator[](int n)
{
return proxy_obj(*this, n);
}
int main() {
my_bit_array bit_set;
bit_set[0] = false;
bool b = bit_set[0];
cout << b << endl;
bit_set[3] = true;
b = bit_set[3];
cout << b << endl;
return 0;
}
答案 1 :(得分:0)
你可以重载下标运算符“[]”以返回能够分配给的元素的地址。
你不能返回对某个位的引用,因为位没有地址,最小的可寻址变量是1个字节(bool或char),由8位组成。
{{1}}