2009-07-17 2 views
5

_com_ptr_には、オーバーロードされた演算子&()に副作用があります。私は、変数を使用している場合:オペレータがC++クラスのためにオーバーロードされている場合、代わりにどのようにデフォルト演算子を使用できますか?

_com_ptr_t<Interface> variable; 

は、どのように私はオーバーロードされた演算子を呼び出して、副作用を誘発することなく(<インタフェース> *ポインタ_com_ptr_t)そのアドレスを取得することができますか?

+0

したいですか? – MSalters

+0

私は_com_ptr_t <> *が必要です。 – sharptooth

答えて

7

私はこのケースがいくつかのoffsetof()マクロ実装(LWG 273)を破ったのでISO会議でポップアップするのを見ました。解決策:&reinterpret_cast<unsigned char&>(variable)

+0

これはこれまで驚くようなケースで私をかむことができましたか? – sharptooth

+0

boost :: address_ofを使用してくださいこれは今後の標準の一部になると思います – ovanes

+0

@ unsigned char lvalueのアドレスは完全に定義されており、reinterpret_castとunsigned char&は、キャストされたオブジェクトが 'operator unsigned char'自体を定義していても動作するはずです。 – MSalters

0

& variable.GetInterfacePtr();

+1

これは、スマートポインタに格納されているポインタのアドレスを取得します。しかし、私は質問がスマートポインタのアドレスを取得する方法についてだと思う。 –

+0

ああ...私の悪い:( – Goz

3

私は、このユーティリティ関数を定義する:あなたは `_com_ptr_t *`や `インタフェース*`を

template<typename T> 
T *GetRealAddr(T &t) 
    { return reinterpret_cast<T*>(&reinterpret_cast<unsigned char &>(t)); } 
関連する問題