На этом шаге мы рассмотрим использование оператора [].
Оператор [] может применяться в классе bitset в следующем контексте:
bitset<размер>::reference bitset<размер>::operator[] (size_t idx) bool bitset<размер>::operator[] (size_t idx) const
Обе формы возвращают значение бита в позиции idx.
Чтобы возвращаемое значение могло использоваться как модифицируемый объект (l-значение), первая форма для неконстантных
битовых полей использует специальные временные объекты - заместители (proxy). Подробности приводятся далее.
Перед вызовом необходимо убедиться в том, что idx представляет действительный индекс; в противном случае вызов приводит к
непредсказуемым последствиям.
При вызове для неконстантных битовых полей оператор [] возвращает специальный временный объект типа bitset<>::reference. Этот
объект используется в качестве заместителя для выполнения некоторых действий с битом, полученным при помощи оператора [].
Замечание.
Заместители позволяют вьполнять операции с объектами, для которых в обычных условиях такая возможность отсутствует. В частности, они часто
используются для защиты данных. В данном случае заместитель позволяет выполнять с возвращаемым значением некоторые операции битовых полей,
хотя в принципе оно ведет себя как обычный объект типа bool.
В частности, для reference определены пять перечисленных ниже операций.
reference& operator= (bool)
Задает значение бита в соответствии с переданной величиной.
reference& operator= (const reference&)
Задает значение бита по другой ссылке.
reference& flip ()
Переводит бит в противоположное состояние.
operator bool () const
Преобразует значение в логическую величину (автоматически).
bool operator~ () const
Возвращает дополнение (противоположное состояние) бита.
Примеры выполнения операций с возвращаемым значением оператора []:
bitset<50> flags; flags[42] = true; // Установка бита 42 flags[13] = flags[42]; // Присваивание значения бита 42 биту 13 flags[42].flip(); // Перевод бита 42 в противоположное состояние if (flags[13]) { // Если бит 13 установлен, flags[10] = -flags[42]; // присвоить дополнение бита 42 биту 10 }
На следующем шаге мы рассмотрим cоздание модифицированных битовых полей.