C ++ - 对bool引用(std :: vector <bool>)</bool>的Cast char引用

时间:2015-03-02 14:50:49

标签: c++ vector casting reference

我在向bool引用转换char引用时遇到问题。我有一个简单的GUI库,它具有以下方法gui->addButton(string name, bool& value);。如果单击该按钮,则会翻转bool。现在我想拥有一个动态/未知的按钮。因此,虽然我可以创建一个bool向量,但只需为每个创建的按钮push_back一个新的bool,并为addButton方法提供对最后一个向量元素的引用。像这样:

bool isOnFlag = true;
buttonFlagVector.push_back(isOnFlag);
gui->addButton(name, buttonFlagVector.back());

可悲的是因为specialization of vector for bools,这不起作用。

从我读到的,避免bool专业化的常用方法是使用std::vector<char>。我试过了,我遇到的问题是我不知道如何从char引用转换为bool引用。 dynamic_cast reinterpret_cast?他们似乎都没有工作。

有人能指出我正确的方向吗?提前谢谢!

2 个答案:

答案 0 :(得分:6)

不幸的是bool的大小是实现定义的,并且可能在不同的编译器上有所不同。所以,即使reinterpret_cast能够奏效,我也会建议不要这样做。相反,您可以使用这样的小包装struct

struct SpecialBool { bool b; };
std::vector<SpecialBool> bools;

不幸的是,您的方法还有另一个问题,即您仍然在向std::vector中添加元素时,无法存储对push_back中元素的引用。在每个{{1}}上,可以重新分配内部存储器,这将使之前的所有引用无效。

答案 1 :(得分:0)

您可以将bool包裹在struct中以避免std::vector<bool>专业化:

struct buttonState
{
    bool checked;
};

std::vector<buttonState> buttonStates;

后者:

bool isOnFlag = true;
buttonFlagVector.push_back({isOnFlag});
gui->addButton(name, buttonFlagVector.back().checked);