类型擦除 - 你是怎么称呼它的?C++类型擦除:boost :: shared_ptr和boost :: function如何工作?
如何boost::shared_ptr
存储其删除器,以及如何boost::function
存储其函数对象?
有没有教伎俩任何教程?
什么是使用类型擦除函数对象的运行时间成本?
类型擦除 - 你是怎么称呼它的?C++类型擦除:boost :: shared_ptr和boost :: function如何工作?
如何boost::shared_ptr
存储其删除器,以及如何boost::function
存储其函数对象?
有没有教伎俩任何教程?
什么是使用类型擦除函数对象的运行时间成本?
的想法很简单,您可以定义与您需要的功能的接口的基类,然后从它继承。由于类型擦除类只使用该接口,下面的实际类型是忘记和删除。或者,如果唯一需要的接口可以表示为自由函数,则可以存储指向自由函数的指针。
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;
}
};
这是一个非常简化的智能指针,但这个想法是存在的。在shared_ptr
的特定情况下,删除器被存储为引用计数对象的一部分,该引用计数对象由指针保存。
您是否在尝试谷歌之前询问?网上有很多信息。老Thamas贝克尔文章:http://www.artima.com/cppsource/type_erasure.html或这个着名的书:http://www.boostpro.com/mplbook/和许多其他资源。 – 2011-06-12 21:36:23
@GeneBushuyev:SO的全部目的基本上是让Google搜索变得不必要。如果你想了解一些与编程有关的主题,你可以谷歌它,并(1)找到一个SO答案,或(2)获得不可靠的信息,可能会或可能不正确,并帮助你。或者您可以(2)在SO上搜索/索取,并获得经同行评审的答案,按质量进行评分,并且几乎保证有用。请不要告诉人们谷歌而不是在这里提问。这适得其反。 – jalf 2012-03-04 00:16:20