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 に答える