2012-04-13 13 views
1

Bitsetの非常に基本的な実装を見てみましょう。シングルビットへの参照を返すブール演算子[](int index)

struct Bitset { 
    bool mask[32]; 

    bool& operator[] (int index) { 
     return mask[index]; 
    } 
}; 

今、私は可能な最適化があり

Bitset bitset; 
bitset[0] = 1; 
std::cout << bitset[0] << "\n"; 

書くことができます。 bool mask[32]の代わりにunsigned intを使用できます。

struct Bitset { 
    unsigned int mask; 

    bool& operator[] (int index) { 
     // ?? 
    } 
}; 

それは、このような仕様にbool& operator[] (int index)を書くことは可能ですか?私はstd::bitsetのようなものをやっていると思うが、どう考えているのだろうか。

+5

'std :: bitset'はおそらく正確にどのビットを突き止めるのかを知っている一種のプロキシオブジェクトを返します。 – Mat

+1

STLのどのコードが何をしているのか知っていれば、ソースを見ない方がいいでしょうか? –

+2

確かに: 'ほとんどのC++環境にこのような小さな要素型が存在しないため、個々の要素はbool要素を模倣する特別な参照としてアクセスされます(http://www.cplusplus.com/reference/stl/bitset/から)。したがって、 'bitmap'の' operator [] 'は' bitset :: reference'を返し、 'bool'は返しません。 @Vlad、 – Vlad

答えて

7

いいえ、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[]から返すこともできます。

+3

これは一般的には十分です(と私はおそらくやっている)が、本当に 'bool& 'をエミュレートしたいのであれば、' | = '、'&= '...、'/= ' (これは愚かですが、 'ブール'はそれをサポートしています)。 –

5

いいえ、できません。変数内のビットは固有のアドレスを持たないので、個々のビットへのポインタや参照を形成することはできません。

生の参照の代わりに「スマートな参照」オブジェクトを返す必要があります。

関連する問題