La idea es simple, usted define una clase base que tiene una interfaz con la funcionalidad que necesita, y luego hereda de ella. Dado que el tipo borró la clase utiliza solo esa interfaz, el tipo real debajo es olvidado y borró. Alternativamente, si la única interfaz necesaria se puede expresar como funciones libres, puede almacenar punteros a las funciones gratuitas.
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;
}
};
Este es un puntero inteligente realmente simplificado, pero la idea está ahí. En el caso particular de shared_ptr
, el eliminador se almacena como parte del objeto de conteo de referencia, que se mantiene mediante el puntero.
¿Intentó google antes de preguntar? hay mucha información en la web. el antiguo artículo de Thamas Becker: http://www.artima.com/cppsource/type_erasure.html o este conocido libro: http://www.boostpro.com/mplbook/ y muchos otros recursos. –
@GeneBushuyev: todo el propósito de SO es básicamente hacer innecesarias las búsquedas de Google. Si desea conocer algún tema relacionado con la programación, puede buscarlo en Google y (1) encontrar una respuesta SO o (2) obtener información no confiable que puede ser correcta o no y puede ayudarlo. O puede (2) buscar/solicitarlo en SO, y obtener respuestas que son revisadas por pares, calificadas por calidad y virtualmente garantizadas para ser útiles. Por favor, no le digas a las personas a Google en lugar de hacer preguntas aquí. Es contraproducente – jalf