定义operator []进行赋值和读取

时间:2016-10-10 19:02:11

标签: c++ operator-overloading

对于以下两种情况,是否可以有operator[]的两个定义?

  • My_bit_array[7] = true;

  • bool x = My_bit_array[0];

这很有用,因为读取一个字节并切换字节的8位之一(uint8_t)是不同的。这两种情况需要两种不同的定义。

2 个答案:

答案 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}}