2017-09-08 1 views
4

C 스타일 bool 배열을 대체하는 표준 방법이 있습니까? 이 코드 조각에서

void legacyFunction(int length, bool *bitset) 
{ 
    // stuff, lots of stuff 
} 

int main() 
{ 
    int somenumber = 6; 
    // somenumber is set to some value here 

    bool *isBitXSet = new bool[somenumber]; 
    // initialisation of isBitXSet. 

    legacyFunction(somenumber, isBitXSet); 

    delete[] isBitXSet; 
    return 0; 
} 

나는

std::vector<bool> isBitXset(somenumber, false); 

처럼 무언가에 의해 bool *isBitXSet = new bool[somenumber];을 교체하고 싶습니다하지만

legacyFunction(somenumber, isBitXSet.data()); 

data() 때문에이 std::vector<bool> 존재하지 않습니다 할 수 없다 . 그리고 legacyFunction()의 인터페이스를 변경할 수 없습니다.

C 스타일 bool 어레이에 대한 좋은 대안이 있습니까?

+0

누락 된'data()'멤버 함수가 유일한 문제는 아닙니다. 'std :: vector '는보다 공간 효율적인 구현을 제공 할 수있는 전문 분야입니다. 그래서'vector '와 C 스타일'bool' 배열의 요소는 겹칠 수 없습니다. –

+0

[벡터에 대한 대안 ] 가능한 복제본 (https://stackoverflow.com/questions/670308/alternative-to-vectorbool) – moooeeeep

+0

@moooeeeep 예, 맞았습니다. 죄송합니다. 일반적으로 나는 혼자서 질문을 삭제할 것이다. 그러나 나는 2009 년의 답변보다 훨씬 더 비토리오 로미오가 준 답변을 좋아합니다. – TobiMcNamobi

답변

7

당신은 std::unique_ptr<T[]>std::make_unique 사용할 수 있습니다 또는

int main() 
{ 
    int somenumber = 6; 
    // somenumber is set to some value here 

    auto isBitXSet = std::make_unique<bool[]>(somenumber);  
    // initialisation of isBitXSet. 

    legacyFunction(somenumber, isBitXSet.get()); 

    return 0; 
} 

, 당신이 당신의 자신의 bool 래퍼를 생성하여 "속임수"std::vector 수 있습니다

struct my_bool { bool _b; }; 
std::vector<my_bool> v; // will not use `vector<bool>` specialization 

당신이 알고있는 경우 컴파일 타임에 배열의 크기를 std::array.

+0

'std :: array'도 가능하지 않나요? – Rakete1111

+4

@ Rakete1111 : 예제에서와 같이'somenumber '가 런타임 값이면 안됩니다. –

+0

좋은 답변입니다! 두 번째 예제에서는 함수 호출을 위해이 방법을 어떻게 적용할까요? 이처럼'legacyFunction (somenumber, reinterpret_cast (v.data())); – TobiMcNamobi

관련 문제