Type erasure - is that how you call it?
How boost::shared_ptr
stores its deleter and how boost::function
stores its function object?
Is there any tutorial that teaches the trick?
What is the run-time cost of using type-erased function objects?
The idea is simple, you define a base class that has an interface with the functionality you need, and then inherit from it. Since the type erased class uses only that interface, the actual type underneath is forgotten and erased. Alternatively, if the only needed interface can be expressed as free functions you can store pointers to the free functions.
namespace detail {
struct deleter_base {
virtual ~deleter_base() {}
virtual void operator()( void* ) = 0;
};
template <typename T>
struct deleter : deleter_base {
virtual void operator()( void* p ) {
delete static_cast<T*>(p);
}
};
}
template <typename T>
class simple_ptr {
T* ptr;
detail::deleter_base* deleter;
public:
template <typename U>
simple_ptr( U* p ) {
ptr = p;
deleter = new detail::deleter<U>();
}
~simple_ptr() {
(*deleter)( ptr );
delete deleter;
}
};
This is a really simplified smart pointer, but the idea is there. In the particular case of shared_ptr
, the deleter is stored as part of the reference count object, that is held by pointer.