2011-01-11 7 views
0

könnte ich Iterator, der auf ein Set-Element zu einem LONG_PTR verweist, umwandeln?Iterator zu LONG_PTR

PS: Ich verstehe nicht vollständig, was ist LONG_PTR?

Hier ist ein Beispiel-Code, der zur Laufzeit eine Fehlermeldung erscheint

#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); 
} 

Antwort

3

A LONGPTR ein __int3264 ist.

In jedem Fall können Sie keinen Iterator auf diesen Typ anwenden, da ein Iterator kein Zeiger ist. Sie können jedoch die Adresse des Elements verwenden, auf das der Iterator zeigt (unter Verwendung von &*it), vorausgesetzt, der Objekttyp, der im Container gespeichert ist, überlädt das unäre & nicht (wenn es das unäre & überlädt, ist es ein schlechtes, schlechtes) Klasse).

+0

@James: Ich bin neugierig (wie ich noch ziemlich neu in C++ bin), haben Sie eine legitime Verwendung für einen überladenen '&' Operator gefunden? – dreamlax

+0

@dreamlax: Nein; Ich habe keinen legitimen Gebrauch davon gesehen. Ich bin sicher, dass es irgendwo in Boost mit einigen tollen Ergebnissen überlastet ist. Es gab eine interessante Verwendung, die AndreyT vor ein paar Monaten veröffentlicht hat. Im Grunde können Sie das unäre '&' überladen, um die Adresse eines temporären Objekts zu erhalten. Ich denke nicht, dass das legitim ist, aber es ist interessant. –

+0

@ James: Würden Sie mich korrigieren, wenn ich falsch 'LONG_PTR lp = reinterpret_cast (&*it);' es ist Iterator Element zu setzen – dfx

0

Wahrscheinlich nicht, wenn Sie std::set von Set bedeuten. Im Allgemeinen sind STL-Iteratoren viel komplexere Objekte als ein Zeiger.

LONG_PTR ist ein Typ, der groß genug ist, um entweder einen langen oder einen Zeiger zu halten.