Hi all,

I would like to discuss some code I'm using to manage COM objects with intrusive_ptr.

1. I need to access the address of the raw pointer (to use QueryInterface). Therefore I
   implemented operator& for intrusive_ptr. Like in COM this pointer-pointer will only
   be used for intialization purposes. My implementation relies on the intrusive_ptr's
   memory layout and returns reinterpret_cast<T**>(addressof(ptr)). I know, this is evil...

   CComPtr-like usage:   
   boost::intrusive_ptr<IVideo> video;
   someObject->QueryInterface(IID_IVideo,(void**)&video);
   
   Is there a better way? How do you bring intrusive_ptr and QueryInterface together?

2. My functions intrusive_ptr_add_ref and intrusive_ptr_release are specialized to handle
   IUnknown instances only. This way I avoid any conflicts with implementations of other
   reference counted objects. Maybe you can make use of them :-)

Here's my code:

template<typename T>
T** operator&(intrusive_ptr<T>& ptr)
{
  ASSERT(0 == *reinterpret_cast<T**>(addressof(ptr)));
  return reinterpret_cast<T**>(addressof(ptr));
}

template<typename T>
inline typename enable_if < is_base_of<IUnknown, T> >::type
intrusive_ptr_add_ref(T* pObject)
{
  pObject->AddRef();  
}

template<typename T>
inline typename enable_if < is_base_of<IUnknown, T> >::type
intrusive_ptr_release(T* pObject)
{
  pObject->Release();
}

Best regards,
Philipp