2014-09-10 3 views
2

나쁜 습관을 가지고 있지만이 문제에 대한 해결 방법이나 해킹 방법을 알고 싶습니다.std :: vector에서 bool 참조 가져 오기 <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

+3

'std :: vector '을 사용하지 않는'A '에 대한 전문화를 제공 할 수 있습니다. – juanchopanza

답변

5

std :: Vector에서 부울 변수에 대한 참조를 얻는 방법이 있습니까?

번호

또는 어떤 다른 해결책은?

T& 대신 typename std::vector<T>::reference을 반환하십시오. bool의 경우 벡터의 프록시 유형을 반환합니다. 다른 사람들은 정규 참조를 반환합니다.

또는 A<bool>을 사용하여 vector<bool> 이외의 문자를 사용하도록 지정하십시오.

bool 대신 다른 유형 (아마도 char 또는 간단한 클래스 래핑 bool)을 사용하십시오.

6

가짜 컨테이너 전문화의 저주를 맞았습니다.

표준이 여전히 전파되고있는 인정받은 설계 오류이므로 표준 전문화를 피하기 위해 템플릿을 전문화해야합니다.

std::vector<mybool> 또는 struct mybool{bool value;};과 같은 특수 문자를 사용하십시오 (그리고 지금까지 오류를 빨리 취소하고 오류를 취소하지 않으려면 완고한위원회를 저주하십시오).

또는 T& 대신 std::vector<T>::reference을 반환하십시오. (가능한 한 절제하지 말고 그 사마귀를 전파하지 마십시오.) 적절한 저주를 잊지 마십시오.

관련 문제