2014-09-10 81 views
2

我知道这是一个坏习惯,但我想知道一些解决方法或hack这个问题。 我有这样一个类:从std :: vector获取布尔引用<bool>

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获取布尔变量的引用?还是有其他解决方案?

+0

它会产生编译错误吗?还是它编译好,但不能以某种方式工作? – wallyk 2014-09-10 15:58:19

+3

您可以为不使用'std :: vector '的'A '提供专业化。 – juanchopanza 2014-09-10 16:02:12

回答

5

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

或者有什么不同的解决方案?

返回typename std::vector<T>::reference而不是T&。对于bool,它将返回矢量的代理类型;对于其他人,它会返回一个常规参考。使用vector<bool>以外的其他东西。

或者使用其他类型(或许是char,或简单的类包装bool)而不是bool

6

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

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

使用std::vector<mybool>struct mybool{bool value;};或某些这样的专业(并诅咒顽固委员会不贬低它快速和现在撤消他们的错误)。

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

相关问题