C++ - 将 char 引用转换为 bool 引用(std::vector<bool>)

Posted

技术标签:

【中文标题】C++ - 将 char 引用转换为 bool 引用(std::vector<bool>)【英文标题】:C++ - Cast char reference to bool referenece (std::vector<bool>) 【发布时间】:2015-03-02 14:50:49 【问题描述】:

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

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

很遗憾,因为specialization of vector for bools,这不起作用。

从我读到的避免布尔特化的常用方法是使用std::vector&lt;char&gt;。我试过了,我遇到的问题是我不知道如何从 char 引用转换为 bool 引用。 dynamic_castreinterpret_cast?它们似乎都不起作用。

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

【问题讨论】:

你能显示不起作用的代码吗? “不起作用”是什么意思?编译器错误、运行时错误、意外的程序行为? 我认为你应该这样做reinterpret_cast&lt;bool&amp;&gt;(buttonFlagVector.back()) @Giulio:很清楚,但 Foaly 也指出,来自 std::vector 的演员表不起作用,链接未涵盖 【参考方案1】:

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

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

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

【讨论】:

作为一种变通方法,如果您事先知道按钮的数量(通常是这种情况),您可以使用reserve 方法预先分配您需要的空间。或者,更好的是,使用std::array。如果你使用array,你甚至没有bool专业化的问题。 好酷!谢谢您的帮助!我想我会用std::array 解决,以避免在重新分配时使所有引用无效的问题。这很糟糕,因为我必须定义最大数量的按钮,但是哦。【参考方案2】:

您可以将您的bool 包装在您的struct 中以避免std::vector&lt;bool&gt; 专业化:

struct buttonState

    bool checked;
;

std::vector<buttonState> buttonStates;

后者:

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

【讨论】:

这是对的,但 Tafuri 指出的问题确实相关,因为重新分配会破坏这段代码,引用指向 undefined-behaviourland。 @GiulioFranco:正如你所建议的,std::reserve 避免了这种情况,但很好。 std::vector&lt;std::unique_ptr&lt;buttonState&gt;&gt; buttonStates; 也可以解决这个问题,并且不修复限制..

以上是关于C++ - 将 char 引用转换为 bool 引用(std::vector<bool>)的主要内容,如果未能解决你的问题,请参考以下文章

c++的问题: 字符串如何转bool型

将 A 转换为 1 B 转换为 2 ... Z 转换为 26,然后将 AA 转换为 27 AB 转换为 28(Excel 中列引用的列索引)

如何最好地将 VARIANT_BOOL 转换为 C++ bool?

C++ 将 char * 转换为 unsigned char

使用 C++ 样式转换将 int 转换为 char [重复]

boost::variant - 为啥“const char*”转换为“bool”?