2011-01-11 3 views
0

set要素を指すイテレータをLONG_PTRにキャストできますか?Iterator to LONG_PTR

PS: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あるポップコード例です。

いずれの場合でも、イテレータはポインタではないので、この型にイテレータをキャストすることはできません。ただし、コンテナに格納されているオブジェクトの型が単精度の&をオーバーロードしないと仮定すると、反復子が指す要素のアドレスを取ることができます(&*itを使用します)(単精度の&をオーバーロードすると、クラス)。

+0

@James:私はまだ興味があります(私はまだC++の新機能として)、オーバーロードされた '&'演算子の正当な使用に遭遇しましたか? – dreamlax

+0

@dreamlax:いいえ。私はそれを正当に使用していません。私はBoostのどこかで過負荷になっていると確信しています。 AndreyTが数ヶ月前に投稿した興味深い用途が1つありました。基本的には、一時オブジェクトのアドレスを取得できるように単項 '&'をオーバーロードすることができます。私はそれが合法だとは思わないが、それは面白い。 –

+0

@ James:私が間違っていると私を修正しますか?LONG_PTR lp = reinterpret_cast (&*it); 'エレメントを設定するイテレータです。 – dfx

0

おそらく、いいえ、あなたが意味するならば、std::setで設定します。一般に、STLイテレータはポインタよりもはるかに複雑なオブジェクトです。

LONG_PTRは、long型またはポインタ型を保持するのに十分な大きさの型です。