2014-09-10 50 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&。 (如果可能,棄權不要傳播那個疣)(不要忘記正確的詛咒)

相關問題