Шаг 354.
Библиотека STL. Специальные контейнеры. Строение класса bitset. Работа с отдельными битами с применением оператора []

    На этом шаге мы рассмотрим использование оператора [].

    Оператор [] может применяться в классе 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оздание модифицированных битовых полей.




Предыдущий шаг Содержание Следующий шаг