C++ - 将 char 引用转换为 bool 引用 (std::vector<bool>)
C++ - Cast char reference to bool referenece (std::vector<bool>)
我在将 char 引用转换为 bool 引用时遇到问题。我有一个简单的 GUI 库,它具有以下方法 gui->addButton(string name, bool& value);
。如果单击按钮,则翻转 bool。现在我想要 dynamic/unknown 个按钮。因此,虽然我可以创建一个布尔值向量,但只需 push_back 为每个创建的按钮创建一个新布尔值,并为 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
? None 其中似乎有效。
有人能指出我正确的方向吗?提前致谢!
不幸的是,bool
的大小是实现定义的,在不同的编译器上可能会有所不同。因此,即使 reinterpret_cast
可以工作,我还是建议不要使用它。相反,您可以使用像这样的小包装器 struct
:
struct SpecialBool { bool b; };
std::vector<SpecialBool> bools;
不幸的是,您的方法还有另一个问题,您无法在 std::vector
中存储对元素的引用,同时您仍在向其中添加元素。在每个 push_back
上,内部存储器可能会被重新分配,这将使您之前的所有引用无效。
您可以将 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);
我在将 char 引用转换为 bool 引用时遇到问题。我有一个简单的 GUI 库,它具有以下方法 gui->addButton(string name, bool& value);
。如果单击按钮,则翻转 bool。现在我想要 dynamic/unknown 个按钮。因此,虽然我可以创建一个布尔值向量,但只需 push_back 为每个创建的按钮创建一个新布尔值,并为 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
? None 其中似乎有效。
有人能指出我正确的方向吗?提前致谢!
不幸的是,bool
的大小是实现定义的,在不同的编译器上可能会有所不同。因此,即使 reinterpret_cast
可以工作,我还是建议不要使用它。相反,您可以使用像这样的小包装器 struct
:
struct SpecialBool { bool b; };
std::vector<SpecialBool> bools;
不幸的是,您的方法还有另一个问题,您无法在 std::vector
中存储对元素的引用,同时您仍在向其中添加元素。在每个 push_back
上,内部存储器可能会被重新分配,这将使您之前的所有引用无效。
您可以将 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);