Только мои 2 цента:
std::vector<bool>::reference
является typedef для struct _Bit_reference
, который определяется как
typedef unsigned long _Bit_type;
struct _Bit_reference
{
_Bit_type * _M_p;
_Bit_type _M_mask;
// constructors, operators, etc...
operator bool() const
{ return !!(*_M_p & _M_mask); }
};
. Меняя функцию, подобную этой, она работает (ну, компилирует, по крайней мере, не проверял):
template< typename T >
void callIfToggled( bool v1, std::vector<bool>::reference v2, T & t )
{
bool b = v2;
if ( v1 != b )
{
v2 = v1;
t.foo();
}
}
EDIT: я изменил условие от (v1! = v2), что не было хорошей идеей, к (v1! = b).