私が取り組んでいるプロジェクトでは、このタイプのコードをよく見かけます。
reinterpret_cast<long>(somePointer)
そして、私はこれの要点を理解していません。通常、ユーザー定義クラスに使用されます。つまり、 somePointer はユーザー定義クラスのインスタンスへのポインターです。
助けてくれてありがとう
私が取り組んでいるプロジェクトでは、このタイプのコードをよく見かけます。
reinterpret_cast<long>(somePointer)
そして、私はこれの要点を理解していません。通常、ユーザー定義クラスに使用されます。つまり、 somePointer はユーザー定義クラスのインスタンスへのポインターです。
助けてくれてありがとう
ポインターは実際には整数値にすぎず、コンパイラーがそれをメモリーアドレスとして解釈するだけです。
これは、他の整数型がアドレスを保持するのに十分な大きさであれば、それを他の整数型に格納できることを意味します (たとえば、64 ビット アドレスを 16 ビット整数変数に格納することはできません)。
しかし、C++ はポインターと通常の整数値を別個の異なる型と見なすため、通常のキャストを行うだけではなく、ポインターを として再解釈long
するようコンパイラーに要求する必要がありreinterpret_cast
ます。
ショーンが言ったように、ポインターを数値であるかのように操作するのに役立ちます。
これを使用して基本的なハッシュ関数を実装するMSDN Web サイトの例を次に示します (これは long ではなく unsigned int を使用することに注意してください。ただし、原則は同じです)。
unsigned short Hash( void *p ) {
unsigned int val = reinterpret_cast<unsigned int>( p );
return ( unsigned short )( val ^ (val >> 16));
}
これは任意のポインターを取り、そのポインターに対して (事実上) 一意のハッシュ値を生成します。ポインターを として扱い、unsigned int
整数値をそれ自体のビット シフト バージョンと XOR し、結果を に切り捨てunsigned short
ます。
ただし、他の皆さんもおっしゃっているように、これは非常に危険であり、避けるべきです。
reinterpret_cast<long>(somePointer)
このコードは、 が保持するアドレスを にキャストします。C ++11 の符号付き/符号なし整数型には、orを使用することsomePointer
をお勧めします。これらは、void ポインターから変換された値を保持することができ、元のポインターと同等の値を持つその型に変換されます。long
intptr_t
uintptr_t