Jump to content

  • Log In with Google      Sign In   
  • Create Account


#ActualKhatharr

Posted 27 November 2012 - 06:28 PM

I find myself creating RAII templates for COM and for IrrKlang objects that behave in a very similar fashion to std::auto_ptr (because I intentionally model them after that behavior). The reason for this is that in both cases the objects manage lifetime using internal reference counting that triggers deconstruction by calls to a member function: comObj->Release() and irkObj->drop(), so std::auto_ptr's simple 'delete' won't cut it here.

The documentation I have says that std::auto_ptr is deprecated, so I'm guessing that we're supposed to use shared_ptr now, even for unshared pointers. I see that shared_ptr supports custom deletion with functors, but the syntax of it makes it sort of difficult to 'shoehorn' that into a new type. In other words, does anyone know of a way to make a derived type from shared_ptr that uses a custom deleter of a set type? So I could say something like:

[source lang="cpp"]//This does not work because template syntax is stupid:template<class T> class Releaser { void operator()(T* p) { p->Release(); }};template<class T> class Releasable : public shared_ptr<T, Releaser>;Releasable<foo> bar(fooPtr); //will call fooPtr->Release(); on dtor[/source]

#1Khatharr

Posted 27 November 2012 - 06:27 PM

I find myself creating RAII templates for COM and for IrrKlang objects that behave in a very similar fashion to std::auto_ptr (because I intentionally model them after that behavior). The reason for this is that in both cases the objects manage lifetime using internal reference counting that triggers deconstruction by calls to a member function: comObj->Release() and irkObj->drop(), so std::auto_ptr's simple 'delete' won't cut it here.
The documentation I have says that std::auto_ptr is deprecated, so I'm guessing that we're supposed to use shared_ptr now, even for unshared pointers. I see that shared_ptr supports custom deletion with functors, but the syntax of it makes it sort of difficult to 'shoehorn' that into a new type. In other words, does anyone know of a way to make a derived type from shared_ptr that uses a custom deleter of a set type? So I could say something like:

[source lang="cpp"]//This does not work because template syntax is stupid:template<class T> class Releaser { void operator()(T* p) { p->Release(); }};template<class T> class Releasable : public shared_ptr<T, Releaser>;Releasable<foo> bar(fooPtr); //will call ->Release(); on dtor[/source]

PARTNERS