reinterpret_cast
読み:リインタープリット-キャスト
外語:reinterpret_cast
C++の予約語の一つ。
概要
次の形で、型キャスト(型変換)に用いる。
reinterpret_cast <型> (変数)
整数とポインター、型の異なるポインターのような、解釈の仕方を変更する。
特徴
用途
Cの場合は、明らかに互換性のない型キャストでも、静的な普通の型キャストが使われる。例えばMicrosoft Windowsでプログラムを組んでいると、頻繁にポインターとLPARAM(unsigned longなど)の相互変換などが必要になる。
unsigned char *p;
unsigned long ul;
ul = (unsigned long)&p;
C++では、通常の型キャストはstatic_cast演算子を用いるが、非互換の型キャストではコンパイルエラーになる。このような場合でも「強引に」型キャストしたい場合、reinterpret_cast演算子が使われる。書式はstatic_castと同じである。
ul = reinterpret_cast<unsigned long>(&p)
なお、reinterpret_castであっても、constの付いたものを外すことは危険すぎて出来ない。これをするためには、const_cast演算子を使う。
利用例
例えばあるインターフェイスを作るとして、その時のパラメーターが stcuct Hoge * だったとする。
どこかでmallocないしcallocあるいはstd::vectorなどをしてメモリーを確保し、そのポインターを受け渡して利用することになるだろう。
こういったC的なインターフェイスはよくあり、C++でも使われている。ただ場合によっては、より多くの情報を保持しておく必要な生じることもある。この場合、stcuct hogeを先頭に含む構造体を用意し、追加の情報を保持する手法が古くから使われている。
stcuct Hogehoge {
stcuct Hoge hoge;
struct Fuga fuga;
};
こうすると、この構造体のポインターを stcuct hoge * として受け渡せば、そのインターフェイスにこの情報を渡すことができる。またこのようにして定義された stcuct hoge * から追加の情報にアクセスしたい場合はキャストすることになる。
この場合、Cなら通常のキャストを使用するが、C++なら reinterpret_cast が利用できる。
struct Hogehoge *hogehoge = reinterpret_cast<struct Hogehoge *>(hoge);
hogehoge->fuga.fugafuga += 123;
再検索