_com_ptr_には、オーバーロードされた演算子&()に副作用があります。私は、変数を使用している場合:オペレータがC++クラスのためにオーバーロードされている場合、代わりにどのようにデフォルト演算子を使用できますか?
_com_ptr_t<Interface> variable;
は、どのように私はオーバーロードされた演算子を呼び出して、副作用を誘発することなく(<インタフェース> *ポインタ_com_ptr_t)そのアドレスを取得することができますか?
_com_ptr_には、オーバーロードされた演算子&()に副作用があります。私は、変数を使用している場合:オペレータがC++クラスのためにオーバーロードされている場合、代わりにどのようにデフォルト演算子を使用できますか?
_com_ptr_t<Interface> variable;
は、どのように私はオーバーロードされた演算子を呼び出して、副作用を誘発することなく(<インタフェース> *ポインタ_com_ptr_t)そのアドレスを取得することができますか?
私はこのケースがいくつかのoffsetof()マクロ実装(LWG 273)を破ったのでISO会議でポップアップするのを見ました。解決策:&reinterpret_cast<unsigned char&>(variable)
これはこれまで驚くようなケースで私をかむことができましたか? – sharptooth
boost :: address_ofを使用してくださいこれは今後の標準の一部になると思います – ovanes
@ unsigned char lvalueのアドレスは完全に定義されており、reinterpret_castとunsigned char&は、キャストされたオブジェクトが 'operator unsigned char'自体を定義していても動作するはずです。 – MSalters
& variable.GetInterfacePtr();
これは、スマートポインタに格納されているポインタのアドレスを取得します。しかし、私は質問がスマートポインタのアドレスを取得する方法についてだと思う。 –
ああ...私の悪い:( – Goz
私は、このユーティリティ関数を定義する:あなたは `_com_ptr_t
template<typename T>
T *GetRealAddr(T &t)
{ return reinterpret_cast<T*>(&reinterpret_cast<unsigned char &>(t)); }
したいですか? – MSalters
私は_com_ptr_t <> *が必要です。 – sharptooth