Re: boost::unique_ptr and problems with deletor argument
On 17 Mrz., 11:20, Christopher <cp...@austin.rr.com> wrote:
Quite awhile back it was advised to me to use a boost::unique_ptr to
[...]
my custom deletion, because I must call Release() on the object.
I finally got around to trying it (as opposed to a shared_ptr) and my
compiler is complaining that I have an invalid template argument for
'D'
I'm not familiar with boost's "unique_ptr-emulation" but if it is
comparable to the proposed std::unique_ptr for C++0x then the
deleter's type needs to be statically known.
How do I tell it," I just want you to call the object's Release()
method? "
Here is my typedef
typdef boost::interprocess:unique_ptr<ID3D10Device, boost::mem_fn
(&ID3D10Device::Release)> ID3D10Device_UniquePtr;
with ID3D10Device being the interface I am obtaining from the COM
library upon which I must call Release()
"boost::mem_fn" is a function that returns a function object. You
can't use this expression as a template's type parameter. What you
need here is the TYPE of that function object. Maybe you can get this
to work with Boost.TypeOf.
Alternativly, you might want to use a "polymorphic" deleter so you
don't have to mention the exact deleter type. This is what shared_ptr
already does for you automatically and internally. If you want a
similar behaviour you could use boost::function for this.
typedef unique_ptr<ID3D10Device,
function<void (ID3D10Device*)>
> ID3D10Device_UniquePtr;
Note: Moving these kinds of pointers may include cloning a heap-
allocated deleter object.
I guess shared_ptr uses polymorphic deleters by default because it
needs to allocate some heap memory anyways for the reference
counters. The reference counters can be combined with the deleter
into a single object.
HTH,
SG