我解決了這個實現的代理類:
class BoolVectorProxy {
public:
explicit BoolVectorProxy(unsigned int& reference, unsigned char index) {
this->reference = &reference;
this->index = index;
}
void operator=(const bool v) {
if (v) *reference |= 1 << index;
else *reference &= ~(1 << index);
}
operator bool() const {
return (*reference >> index) & 1;
}
private:
unsigned int* reference;
unsigned char index;
};
和主類中:
BoolVectorProxy operator[](std::size_t index) {
validate_bound(index);
return BoolVectorProxy(array[index/BLOCK_CAPACITY], index % BLOCK_CAPACITY);
}
我還使用捕捉作爲測試庫,代碼通過測試:
TEST_CASE("access and assignment with brackets", "[Vector]") {
Vector<bool> a(10);
a[0] = true;
a[0] = false;
REQUIRE(!a[0]);
a[1] = true;
REQUIRE(a[1]);
const Vector<bool> &b = a;
REQUIRE(!b[0]);
REQUIRE(b[1]);
a[0] = true;
REQUIRE(a[0]);
REQUIRE(b[0]);
REQUIRE(b.size() == 10);
REQUIRE_THROWS(a[-1]);
REQUIRE_THROWS(a[10]);
REQUIRE_THROWS(b[-1]);
REQUIRE_THROWS(b[10]);
}
如果有人認爲,可以由任何問題或改進,請發表評論,謝謝!
典型方法涉及返回代理類的實例 - 其保持參考回容器類,以及它所代表的比特的索引。然後這個類將提供相應地讀取和寫入該位的'operator bool()'和'operator =(bool)'。 –
這幾乎是每個人都討厭'std :: vector'的原因。它的接口要求與其他所有內容不一致,包括所有其他類型的向量。 –
chris
我不討厭它。 ;)雖然它不應該是'std :: vector',IMO的專門化,就像'std :: bit_vector'。 – cubuspl42