template class CCL::UnknownPtr

Smart pointer class for interfaces, managing queryInteface() and release().

#include <smartptr.h>

template <class T>
class UnknownPtr
{
public:
    // construction

    UnknownPtr (IUnknown* unk = nullptr);
    UnknownPtr (const UnknownPtr& other);

    template  <class P>
    UnknownPtr (const UnknownPtr <P>& other);

    template  <class P>
    UnknownPtr (const AutoPtr <P>& other);

    template  <class P>
    UnknownPtr (const SharedPtr <P>& other);

    // methods

    bool isValid () const;
    UnknownPtr& release ();
    T* detach ();
    void** as_ppv ();
    T* as_plain () const;
    UnknownPtr& assign (IUnknown* unk);
    UnknownPtr& operator = (IUnknown* unk);
    UnknownPtr& operator = (const UnknownPtr& other);

    template  <class P>
    UnknownPtr& operator = (const UnknownPtr <P>& other);

    template  <class P>
    UnknownPtr& operator = (const AutoPtr <P>& other);

    template  <class P>
    UnknownPtr& operator = (const SharedPtr <P>& other);

    T* operator -> () const;
    operator T* () const;
    operator T*& ();

    template  <class T>
    UnknownPtr <T>& operator = (const UnknownPtr <T>& other);

    template  <class P>
    UnknownPtr <T>& operator = (const UnknownPtr <P>& other);

    template  <class P>
    UnknownPtr <T>& operator = (const AutoPtr <P>& other);

    template  <class P>
    UnknownPtr <T>& operator = (const SharedPtr <P>& other);
};