
On Fri, Mar 20, 2009 at 7:03 AM, Peter Dimov <pdimov@pdimov.com> wrote:
Kenny Riddile:
I'm trying to do something like this:
boost::shared_ptr<const Foo> fooPtr( boost::static_pointer_cast<const Foo>(typeErasedFoo), CustomDeleter<const Foo>() );
where typeErasedFoo is of type:
boost::shared_ptr<const void>
Just to clarify Peter's point, deletion policy decisions should be made at initialization time, not as a part of a type conversion. So, your original object construction, which you don't show, should set your custom deleter when you create the pointer that receives your "new Foo". A custom deleter is a part of the underlying "value" of the smart pointer, and as such are preserved across casts, so there shouldn't be a need for the kind of call you're trying to do. The code below demonstrates what I mean: #include <iostream> #include <boost/shared_ptr.hpp> struct Foo{}; struct FooDeleter{ void operator()( Foo* f ) { std::cout << "Goodbye, cruel world!"; delete f; } }; int main() { boost::shared_ptr<Foo> pFoo; { boost::shared_ptr<void> pVoid; { boost::shared_ptr<Foo> pTmp( new Foo, FooDeleter() ); pVoid = pTmp; } pFoo = boost::static_pointer_cast<Foo>( pVoid ); } // emits "Goodbye, cruel world!" when pFoo is destructed. } Naturally, you don't have to use a shared_ptr<Foo> when you first allocate the Foo object, it's perfectly valid for the pTmp variable to be eliminated and simply declare: boost::shared_ptr<void> pVoid( new Foo, FooDeleter() ); HTH, Christopher