por qué vector :: referencia no devuelve la referencia a bool?
en c, el contenedor std :: vector está especializado para valores booleanos. Esta especialización introduce diferencias en el comportamiento en comparación con los vectores de otros tipos de datos.
el problema
En el ejemplo proporcionado, una función Calliftoggled se usa para alternar un valor de bool y llamar a un método en una estructura. Al intentar pasar una referencia a un elemento de un std :: vector a Calliftoggled, se produce un error de compilación. Esto se debe a que el tipo de referencia devuelto por Vector :: Reference no es el bool esperado &.
la razón
dentro de la especialización de vector bool, vector :: La referencia devuelve una referencia a un char, no un bool. Esto se hace para optimizar el rendimiento utilizando una representación bitwise para valores booleanos.
solucions
[&]
- use vector en su lugar: reemplazar el vector bool con un vector para trabajar alrededor del problema de especialización. Biblioteca: La biblioteca de contenedores Boost proporciona una versión no especializada de Vector que ofrece una referencia verdadera a los valores de Bool.
- Wrap Bool Valores en una estructura: Crear una estructura de envoltura alrededor de Bool llamada MyBool. Esto permite pasar una referencia al contenedor, que a su vez proporciona acceso indirecto al valor de bool subyacente.
- ejemplo (vector de char):
#incluir
estructurar
{
void foo () {}
};
plantilla
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 = falso;
A a;
Calliftoggled (F, V [0], a);
Calliftoggled (F, V [1], a);
Calliftoggled (F, V [2], a);
}