2009-07-17 32 views
5

_com_ptr_ có toán tử quá tải &() có tác dụng phụ. Nếu tôi có một biến:Nếu toán tử bị quá tải đối với lớp C++, làm thế nào tôi có thể sử dụng toán tử mặc định thay thế?

_com_ptr_t<Interface> variable; 

Làm thế nào tôi có thể lấy nó địa chỉ (_com_ptr_t <Interface> * con trỏ) mà không gọi các nhà điều hành quá tải và gây ra tác dụng phụ?

+0

Bạn có muốn một '_com_ptr_t * 'hoặc một' Giao diện *'? – MSalters

+0

Tôi muốn có _com_ptr_t <> *. – sharptooth

Trả lời

7

Tôi đã nhìn thấy trường hợp này bật lên trong một cuộc họp ISO vì nó đã phá vỡ một số offsetof() macro triển khai (LWG 273). Giải pháp: &reinterpret_cast<unsigned char&>(variable)

+0

Điều này có thể khiến tôi bị sốc trong một số trường hợp đáng ngạc nhiên không? – sharptooth

+0

sử dụng boost :: address_of. Nó được dựa trên việc triển khai được cung cấp trong bài đăng này, tôi nghĩ rằng nó sẽ là một phần của tiêu chuẩn sắp tới – ovanes

+0

@ Lấy địa chỉ của một unsigned char lvalue được định nghĩa hoàn hảo, và reinterpret_cast để unsigned char & nên làm việc ngay cả khi các đối tượng cast định nghĩa 'operator unsigned char' chính nó. – MSalters

0

& biến.GetInterfacePtr();

+1

Việc này sẽ lấy địa chỉ của con trỏ được lưu trong con trỏ thông minh. Tuy nhiên, tôi nghĩ câu hỏi là về cách lấy địa chỉ của con trỏ thông minh. –

+0

Ah ... xấu của tôi: ( – Goz

3

tôi xác định chức năng tiện ích này:

template<typename T> 
T *GetRealAddr(T &t) 
    { return reinterpret_cast<T*>(&reinterpret_cast<unsigned char &>(t)); } 
Các vấn đề liên quan