次のプログラムを検討してください。
struct ghost
{
// ghosts like to pretend that they don't exist
ghost* operator&() const volatile { return 0; }
};
int main()
{
ghost clyde;
ghost* clydes_address = &clyde; // darn; that's not clyde's address :'(
}
clyde
のアドレスを取得するにはどうすればよいですか?
私は、あらゆる種類のオブジェクトに対して同等に機能するソリューションを探しています。 C++ 03ソリューションはすてきですが、C++ 11ソリューションにも興味があります。可能であれば、実装固有の動作を避けましょう。
C++ 11のstd::addressof
関数テンプレートですが、ここで使用することに興味はありません。標準ライブラリの実装者がこの関数テンプレートを実装する方法を理解したいと思います。
基本的に、オブジェクトをcharへの参照として再解釈し、そのアドレスを取得して(オーバーロードを呼び出さない)、ポインターを自分のタイプのポインターにキャストし直します。
Boost.AddressOfコードはまさにvolatile
とconst
の資格を追加的に考慮してそれを行います。
私はこれを行うaddressof
の実装を見てきました:
char* start = &reinterpret_cast<char&>(clyde);
ghost* pointer_to_clyde = reinterpret_cast<ghost*>(start);
これがどの程度適合しているかを聞かないでください!
boost :: addressof とその実装を見てください。