Подивіться, як це реалізовано. STL багато в чому базується на шаблонах, і тому заголовки містять код, який вони роблять.
наприклад , погляд на STDC ++ реалізації тут .
Також цікаво , навіть якщо не СТЛ відповідний бітовий вектор є LLVM :: BitVector з тут .
суть llvm::BitVector
a - це вкладений клас, який називається reference
і підходить для оператора перевантаження, щоб зробити BitVector
поведінку схожою vector
з деякими обмеженнями. Наведений нижче код - це спрощений інтерфейс, який показує, як BitVector приховує клас, покликаний reference
зробити так, щоб реальна реалізація майже поводилася як справжній масив bool, не використовуючи 1 байт для кожного значення.
class BitVector {
public:
class reference {
reference &operator=(reference t);
reference& operator=(bool t);
operator bool() const;
};
reference operator[](unsigned Idx);
bool operator[](unsigned Idx) const;
};
цей код тут має приємні властивості:
BitVector b(10, false); // size 10, default false
BitVector::reference &x = b[5]; // that's what really happens
bool y = b[5]; // implicitly converted to bool
assert(b[5] == false); // converted to bool
assert(b[6] == b[7]); // bool operator==(const reference &, const reference &);
b[5] = true; // assignment on reference
assert(b[5] == true); // and actually it does work.
Цей код насправді має недолік, спробуйте запустити:
std::for_each(&b[5], &b[6], some_func); // address of reference not an iterator
не буде працювати, тому що assert( (&b[5] - &b[3]) == (5 - 3) );
зазнає невдачі (всередині llvm::BitVector
)
це дуже проста версія llvm. std::vector<bool>
в ньому також працюють ітератори. таким чином дзвінок for(auto i = b.begin(), e = b.end(); i != e; ++i)
буде працювати. а також std::vector<bool>::const_iterator
.
Однак все ще існують обмеження, std::vector<bool>
які змушують його поводитися по-різному в деяких випадках.