2011-06-12 13 views
18

Tipo de borrado: ¿así es como lo llamas?Tipo de borrado en C++: ¿cómo funcionan las funciones boost :: shared_ptr y boost :: function?

¿Cómo almacena boost::shared_ptr su eliminador y cómo boost::function almacena su objeto de función?

¿Hay algún tutorial que enseñe el truco?

¿Cuál es el costo de tiempo de ejecución de usar objetos de función borrados por tipo?

+2

¿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. –

+14

@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

Respuesta

23

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.

+0

El delegado shared_ptr no tiene que derivarse de nada. – pic11

+5

@ pic11: El eliminador pasado al 'shared_ptr' no necesita heredar, * pero * el borrado de tipo se implementa usando herencia (o punteros a funciones) internamente. –

+0

¿Cómo se llama a un objeto de función si no se conoce su tipo estático y/o no hereda de una clase base? – pic11

Cuestiones relacionadas