#include <vector>
struct A
{
void foo(){}
};
template< typename T >
void callIfToggled( bool v1, bool &v2, T & t )
{
if ( v1 != v2 )
{
v2 = v1;
t.foo();
}
}
int main()
{
std::vector< bool > v= { false, true, false };
const bool f = false;
A a;
callIfToggled( f, v[0], a );
callIfToggled( f, v[1], a );
callIfToggled( f, v[2], a );
}
Run Code Online (Sandbox Code Playgroud)
上面示例的编译会产生下一个错误:
dk2.cpp: In function 'int main()':
dk2.cpp:29:28: error: no …Run Code Online (Sandbox Code Playgroud) 我正在使用用户定义的位数(我持有三维位数组,因此大小立方增加 - 假设不小于512位),并且需要单独翻转它们.现在,只是在计算机上,我正在使用该bool类型,因为内存不是问题.我计划将来将代码移到微控制器上,因此处理能力和内存要求可能是一个问题.不过现在,我只想要速度.
然后我std::bitset从C++ STL中找到了该对象,但我无法在运行时定义bitset的大小.然后我发现std::vector<byte>有一个特殊的初始化器将它们存储为位(而不是整个字节,或4个字节),但随后在维基百科中找到了这一部分:
标准库定义了
vector模板的特化bool.此专业化的描述表明实现应该打包元素,以便每个bool只使用 一位内存.这被普遍认为是一个错误.[...] C++标准委员会和图书馆工作组之间存在普遍共识,vector<bool>应该弃用并随后从标准库中删除,而功能将以不同的名称重新引入.
现在,你可能会看到我想要使用一个vector<bool>对象,但在阅读之后,我正在考虑使用其他东西.唯一的问题是我不知道该使用什么.我很好奇为什么他们说应该重新引入功能(尽管名称不同).
所以,我的问题是,vector<bool>对象的使用是否可以接受(因为它们是STL的一部分)?它们是C++标准的一部分吗?
如果他们的使用是不可接受的,是否有一个可接受的替代解决方案(我自己定义一个特殊的容器)?我自己也有一些想法,但我很好奇是否有人有更好的解决方案.另外,我想避免使用大型库(同样,我希望最终将此代码移植到微控制器).
以下代码无法编译
#include <vector>
int main()
{
std::vector<bool> enable(10);
enable[0] |= true;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
给出错误
no match for ‘operator|=’ (operand types are ‘std::vector<bool>::reference {aka std::_Bit_reference}’ and ‘bool’)
Run Code Online (Sandbox Code Playgroud)
在我的实际代码中,我有一个位域,其中包含我想要|=的函数结果值。
有简单的方法可以表达相同的想法,但是有没有充分的理由使这种运算符不可用?