2012-08-03 2 views
0

일부 TMP를 수행하는 동안 :) ( STL 컨테이너가 보유하는 요소의 크기가 필요했습니다. 컨테이너가 비어 있는지 확인하지 않고 container.begin() 반복자가 잘못되었음을 알고 있습니다. 나는 그것을 안전를 추측 그래서는 sizeof는 컴파일 타임 매크로 알고 맞죠sizeof (* s.begin())를 안전하게 사용하고 있습니까?

코드이다.?이

for(auto it = t.begin(); it!= t.end(); ++it) 
    { 
     char* cp = (char*)(&(*it)); 
     for (size_t i =0 ; i < sizeof *t.begin();++i) 
     //... 
    } 

답변

11

네, 안전,하지만 당신은 저장 유형에서 얻을 수 있다는 걸 컨테이너 내에서 key_type, mapped_type 및/또는 value_typetypedef 명의 회원.

예컨대 :

struct Foo { 
    int bla; 
    double quuxly; 
}; 

int main() 
{ 
    typedef std::vector<Foo> foovector; 
    std::cout << "sizeof(Foo) == " << sizeof(foovector::value_type) << "\n"; 
} 

[sizeof은 BTW하는 매크로 없습니다. 그것은 ++ 또는 |= 같은 언어 자체에 내장 운영자입니다.] sizeof(...) 내의 표현식이 평가되지 않기 때문에

+0

+1 대신'typedef'를 사용하십시오. 예를 들어;) –

+0

@ D.Shawley : 거기에 간다! –

6

그것은 은 안전입니다. sizeof (및 유사하게 decltype, typeid 및 기타 유사한 구조체)에 대해서는 유형만이 중요합니다. 그 값은 아무런 관심이 없습니다. (컴파일시에 의 값이 일 때 어떻게 될까요?) 이것이 표현을 평가할 필요가없는 이유입니다. 심지어 널 포인터를 역 참조하는 것은 평가되지 않은 상황에서 안전합니다.

+0

** 이유 **를 제공 한 +1 (컨테이너가 비어있는 경우에도 허용). –