最善の方法は、プロジェクトを修正して、ポインターを処理できるようにすることです。整数とポインタは2つの異なるものです。前後に変換することはできますが、注意しないと、そのような変換によって情報が失われる可能性があります。
実装と基盤となるプラットフォームによっては、ポインター値をint
再度変換すると、情報が簡単に失われる可能性があります。たとえばint
、ポインタよりも小さいシステムがあります。32ビットint
と64ビットのポインターがある場合、ポインターをとに変換したりint
、元に戻したりすると、ほぼ確実に無効なポインターになります。
情報を失うことなく、変換されたポインタ値を保持するのに十分な幅である可能long
性が非常に高いです。unsigned long
私はそうでないシステムで働いたことがありません。(個人的には、符号なしの型を好む傾向がありますが、本当に正当な理由はありません。どちらも同じように機能するはずです。)
したがって、たとえば次のように書くことができます。
SoundPlayer* player = new FxPlayerTiny();
return reinterpret_cast<unsigned long>player;
unsigned long
を使用して値をポインタに変換し直しますreinterpret_cast,SoundPlayer*>
。
新しい実装では、typedefuintptr_t
とintptr_t
、が提供されます。これらは、ポインタから整数、ポインタへのラウンドトリップ変換で正しく機能することが保証されている符号なしおよび符号付き整数型です。これらはC99で導入され、オプション<stdint.h>
でヘッダーで定義されています。(ポインターがどの整数型よりも大きい実装では定義されませんが、そのような実装はまれです。)C ++は2011標準でそれらを採用し、<cstdint>
ヘッダーで定義しました。ただし、Microsoft Visual C ++は、2010バージョンの時点でそれらをサポートしています。
この保証は通常のポインターにのみ適用され、関数ポインターやメンバーポインターには適用されません。
したがって、これを行う必要がある場合は、次のように書くことができます。
#include <cstdint>
SoundPlayer* player = new FxPlayerTiny();
return reinterpret_cast<std::uintptr_t>player;
しかし、最初に、これを考慮してください。new FxPlayerTiny()
あなたにポインタ値を与えます、そしてあなたはポインタ値が欲しいでしょう。可能であれば、それをポインタとして保持してください。それを整数に変換するということは、いくつかの手法のどれを使用するかを決定する必要があり、整数値が表すことになっているポインターの種類を追跡する必要があることを意味します。十分な大きさではない整数型を使用したり、格納したポインタ型を追跡できなくなったりした場合、コンパイラは警告を表示しない可能性があります。
おそらくあなたはそれをする必要がある正当な理由があります、しかしあなたがただポインターとしてポインターを保存することができればあなたの人生はずっと楽になるでしょう。