почему Vector :: ссылка не возвращает ссылку на Bool?
в c, std :: evector контейнер специализирован для булевых значений. Эта специализация вводит различия в поведении по сравнению с векторами других типов данных.
проблема
В приведенном примере используется функция Calliftoggled для переключения значения Bool и вызвать метод в структуре. При попытке передать ссылку на элемент std :: vector Calliftoggled, возникает ошибка компиляции. Это связано с тем, что ссылочный тип, возвращаемый Vector :: Справочник не является ожидаемой Bool &.
Причина
в рамках специализации вектора Bool, Vector :: ссылка возвращает ссылку на символ, а не в Bool. Это делается для оптимизации производительности с использованием кусочков для логических значений.
решения
- используйте вектор вместо: заменить вектор bool на вектор для работы в специализации. Библиотека:
Библиотека контейнеров Boost предоставляет неопределенную версию Vector , которая предлагает истинную ссылку на значения Bool. - обернуть значения Bool в структуре:
создать структуру обертки вокруг Bool, называемого Mybool. Это позволяет передавать ссылку на обертку, которая, в свою очередь, обеспечивает косвенный доступ к базовому значению Bool. - ]
пример (вектор char):
#Incult
структура а
{
void foo () {}
};
Шаблон
void calliftoggled (char v1, char & v2, t & t)
{
if (v1! = v2)
{
v2 = v1;
t.foo ();
}
}
int main ()
{
std :: vector v = {false, true, false};
const char f = false;
А;
calliftoggled (f, v [0], a);
calliftoggled (f, v [1], a);
calliftoggled (f, v [2], a);
} ]