2011-01-11 3 views
0

집합 요소를 가리키는 반복자를 LONG_PTR로 캐스팅 할 수 있습니까?Iterator to LONG_PTR

추신 : 나는 LONG_PTR이 무엇인지 완전히 이해하지 못하고 있습니까? 여기

#include <windows.h> 
#include <set> 
#include <string> 
using namespace std; 

void func(LPARAM lp) 
{ 
    set<string>::iterator *it = reinterpret_cast<set<string>::iterator*>(lp); 

    string s = *(*it); //runtime-error 
} 

int main() 
{ 
    char *arr[] = {"0", "1", "2", "3", "4", "5"}; 

    set<string> s(arr, arr+5); 
    set<string>::iterator it = s.begin()++; 

    LONG_PTR lp = reinterpret_cast<LONG_PTR>(&*it); 

    func(lp); 
} 

답변

3

LONGPTR__int3264이다 런타임 에러 팝업 예 코드이다.

반복기가 포인터가 아니므로 어쨌든이 유형에 이터레이터를 캐스팅 할 수 없습니다. 그러나 컨테이너에 저장된 객체 유형이 unary &을 오버로드하지 않는다고 가정하면 이테 레이터가 가리키는 요소의 주소를 가져올 수 있습니다 (&*it 사용). 단 하나의 오버플로가 & 인 경우 나쁘고 좋지 않습니다. 수업).

+0

@James : 나는 여전히 C++을 처음 접했을 때 궁금해. 과부하가 걸린'&'연산자에 대한 합법적 인 사용에 직면 했습니까? – dreamlax

+0

@dreamlax : 아니요. 나는 그것의 합법적 인 사용을 보지 못했습니다. Boost의 어딘가에 굉장한 결과로 오버로드되어있을 것이라고 확신합니다. AndreyT가 몇 달 전에 게시 한 재미있는 용도가있었습니다. 기본적으로 임시 객체의 주소를 가져올 수 있도록 단항 '&'을 오버로드 할 수 있습니다. 나는 그것이 합법적이라고 생각하지 않지만 흥미 롭습니다. –

+0

@ James : 틀렸 으면 정정 하시겠습니까? LONG_PTR lp = reinterpret_cast (&*it);'요소를 설정하는 것은 반복자입니다. – dfx

0

아마, 아니, 혹시 std::set으로 설정하십시오. 일반적으로 STL 반복자는 포인터보다 훨씬 복잡한 객체입니다.

LONG_PTR은 길거나 포인터를 포함 할만큼 충분히 큰 유형입니다.