我知道这是一个坏习惯,但我想知道一些解决方法或破解这个问题。 我有一个这样的课:
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获取布尔变量的引用?或者任何不同的解决方案?
答案 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
。