从std :: vector <bool> </bool>获取bool引用

时间:2014-09-10 15:54:42

标签: c++ boolean stdvector

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

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;

但如果有人使用 bool 作为模板参数

,它就会停止工作
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获取布尔变量的引用?或者任何不同的解决方案?

2 个答案:

答案 0 :(得分:7)

你击中了假容器专业化的诅咒。

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

在您的专业化中使用std::vector<mybool>struct mybool{bool value;};或其他类似的东西(并诅咒顽固的委员会,因为它不会快速弃用它并立即撤消它们的错误。)

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

答案 1 :(得分:5)

  

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

没有

  

或任何不同的解决方案?

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

或将A<bool>专门用于使用vector<bool>以外的其他内容。

或者使用其他类型(可能char或包含bool的简单类)而不是bool