从 std::vector <bool>获取布尔值引用

Getting a bool reference from std::vector<bool>

本文关键字:获取 布尔值 引用 gt lt std vector bool      更新时间:2023-10-16

我知道这是一个坏习惯,但我想知道这个问题的一些解决方法或技巧。我有这样的课程:

template <class T>
class A : std::vector<T> {
  T& operator()(int index) { // returns a _reference_ to an object
    return this->operator[](index);
  }
};

可以做这样的事情:

A<int> a{1,2,3,4};
a(3) = 10;

但是如果有人使用布尔值作为模板参数,它会停止工作

A<bool> a{true, false, true};
std::cout << a(0) << std::endl; // not possible
if (a(1)) { /* something */ }   // not possible

std::vector<bool>是矢量(http://www.cplusplus.com/reference/vector/vector-bool/(的专用版本,不允许这样的事情。

有没有办法从 std::Vector 获取布尔变量的引用?还是任何不同的解决方案?

有没有办法从 std::Vector 获取布尔变量的引用?

不。

还是任何不同的解决方案?

返回typename std::vector<T>::reference而不是T&。对于bool,它将返回向量的代理类型;对于其他人,它将返回常规引用。

或者专门A<bool>使用vector<bool>以外的其他东西。

或者使用其他类型(可能是char,或者包装bool的简单类(代替bool

你遇到了假容器专业化的诅咒。

这是一个公认的设计错误,标准仍在传播,因此您需要专门化模板以避免标准专用化。

在你的专业中使用带有struct mybool{bool value;};或类似内容的std::vector<mybool>(并诅咒顽固的委员会没有快速弃用它并消除他们的错误(。

或者,只需返回std::vector<T>::reference而不是T&。(如果可能的话弃权,不要传播那个疣((不要忘记正确的诅咒(