2012-03-02 4 views
1

operator&CComPtrがオーバーロードされるため、一般的に書かれたコードがクラッシュします。演算子がオーバーロードされたオブジェクトのアドレスを取得します。&

変数にオブジェクトのアドレスを返すように強制する方法があるのでしょうか?

+2

これは言い換えればよいでしょう。 –

+0

私はCOMで一度も働いたことはありませんが、オーバーロードされた演算子を持たない 'CComPtr'の基本クラスがありますか? 'CComPtr'をこのクラスにキャストし、アドレスを取得してキャストすることができます。あるいは、本当に物事を混乱させたい場合は、&reinterpret_cast (theCComPtr) 'を実行することができます。しかし、それは私がやってお勧めするものではありません。 – Linuxios

+1

@Mike Seymourは、後で私のコメントのために削除された回答を提供しました。 boost :: addressofの実装を見た後、彼の答えは正しいと思います。削除してはならず、受け入れられるべきです。 –

答えて

4

ソリューションは恐ろしいです:

reinterpret_cast<CComPtr*>(&reinterpret_cast<char&>(ptr)) 
+0

問題はそれがジェネリックコードなので、どんなタイプでも動作する必要があるということです。 – xcrypt

+0

私はWindows開発者ではありませんが、これは非常に危険です。たとえば、 'ptr'が完全なオブジェクトのサブオブジェクトを参照している場合や、' CComPtr'が完全な型の仮想ベースである場合、私は恐ろしい方法でこの破損を見ることができます... –

+3

@xcrypt:おそらく、タイプが利用可能です(テンプレートパラメータなどとして) - それを 'CComPtr'に置き換えます。 –

2

あなたが使用することを検討して、ブーストを使用することができる場合:addressof、あなたは、実装を見てみることができない場合。

0

CComPtrCComPtrBaseにキャストできます。これは、MSDNページから収集できるもので、オーバーロードされた演算子がありません。これが動作するかどうか、私は(私はそれを試すことができません)知りませんが、それはかもしれないようにそれはそうと、それがない場合、それはreinterpret_castその後、少しはましだ

CComPtr* addr=dynamic_cast<CComPtr*>(&((CComPtrBase)theCComPtr)); 

:それはこのようになります。溶液。

+0

'CComPtrBase'にキャストするとコピーコンストラクタが呼び出されます。おそらくあなたが望むものではないでしょう。また、rvaluesに '&'演算子を適用することはできないので、コンパイルしてはいけません。 – fredoverflow

+0

ああ。うわー。私はCOMを一度も使用していないので、私はここでいくつかの限られたC++知識に取り組んでいます。 – Linuxios

関連する問題