2011-06-12 124 views
18

类型擦除 - 你是怎么称呼它的?C++类型擦除:boost :: shared_ptr和boost :: function如何工作?

如何boost::shared_ptr存储其删除器,以及如何boost::function存储其函数对象?

有没有教伎俩任何教程?

什么是使用类型擦除函数对象的运行时间成本?

+2

您是否在尝试谷歌之前询问?网上有很多信息。老Thamas贝克尔文章:http://www.artima.com/cppsource/type_erasure.html或这个着名的书:http://www.boostpro.com/mplbook/和许多其他资源。 – 2011-06-12 21:36:23

+14

@GeneBushuyev:SO的全部目的基本上是让Google搜索变得不必要。如果你想了解一些与编程有关的主题,你可以谷歌它,并(1)找到一个SO答案,或(2)获得不可靠的信息,可能会或可能不正确,并帮助你。或者您可以(2)在SO上搜索/索取,并获得经同行评审的答案,按质量进行评分,并且几乎保证有用。请不要告诉人们谷歌而不是在这里提问。这适得其反。 – jalf 2012-03-04 00:16:20

回答

23

的想法很简单,您可以定义与您需要的功能的接口的基类,然后从它继承。由于类型擦除类只使用该接口,下面的实际类型是忘记删除。或者,如果唯一需要的接口可以表示为自由函数,则可以存储指向自由函数的指针。

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的特定情况下,删除器被存储为引用计数对象的一部分,该引用计数对象由指针保存。

+0

shared_ptr deleter不必从任何东西派生。 – pic11 2011-06-12 21:28:07

+5

@ pic11:传递给'shared_ptr'的deleter不需要继承,*但通过在内部使用继承(或函数指针)来实现*类型的擦除。 – 2011-06-12 21:31:09

+0

如果你不知道它的静态类型和/或它没有从基类继承,你如何调用一个函数对象? – pic11 2011-06-12 21:35:13

相关问题