Вы можете попробовать это расширение
public static bool IsSubClassOfGenericClass(this Type type, Type genericClass,Type t)
{
return type.IsSubclassOf(genericClass.MakeGenericType(new[] { t }));
}
Или как насчет того, чтобы использовать stl для обеспечения функтора обертки - описание Doug T., но без пользовательской вызывающей стороны.
boost::shared_ptr<T> ptr( new T, std::mem_fun_ref(&T::deleteMe) );
boost::shared_ptr<S> ptr( new S, std::ptr_fun(lib_freeXYZ) );
Можно дать шаблону shared_ptr пользовательскую функцию средства удаления, которая имеет подпись
void Deleter( T* ptr);
для повышения:: shared_ptr
Так для Средства удаления Вы сделали бы
boost::shared_ptr<T> ptrToT( new T, Deleter );
тогда в теле Средства удаления:
void Deleter( T* ptr);
{
ptr->deleteMe();
// And make sure YOU ACTUALLY DELETE (or do whatever else you need to
// do to release the resource)
delete ptr;
}
Для Вашего конкретного случая при необходимости в чем-то простом (как ptr-> deleteMe) посмотрите решение Greg, его очень хорошее.
Для данных C-стиля сделайте как @Doug. T предложенный.
Для Вашего класса, почему бы не очистка в деструкторе? Даже если это включает deleteMe () в деструкторе.
Doug T. ответил на Ваш вопрос приятно. Я скажу Вам о intrusive_ptr. Возможно, можно использовать его в проекте также.
, Если у Вас есть некоторая библиотека C, которая уже имеет подсчет ссылок, но необходимо вручную вызвать те функции, можно использовать boost::intrusive_ptr
также, и предоставить надлежащие определения для его add_ref и выпустить функции. intrusive_ptr найдет и назовет их. Они ответственны, чтобы увеличить подсчет ссылок и постепенно уменьшить его, освобождая ресурс когда необходимый:
void intrusive_ptr_add_ref(foo *f) {
lib_add_ref(f);
}
void intrusive_ptr_release(foo *f) {
if(lib_dec_ref(f) == 0)
lib_free(f);
}
Тогда можно просто создать объекты из необработанных указателей типа foo*
. intrusive_ptr , вызовет функции, когда копировал/разрушал:
intrusive_ptr<foo> f(lib_alloc());
// can wrap raw pointers too, which already may be referenced somewhere else
foo *p = get_foo_from_somewhere();
function_taking_intrusive_ptr(p);