C++ 在C+中键入擦除+;:boost::shared_ptr和boost::function如何工作?

C++ 在C+中键入擦除+;:boost::shared_ptr和boost::function如何工作?,c++,boost,type-erasure,C++,Boost,Type Erasure,键入擦除-你是这样称呼它的吗 boost::shared_ptr如何存储其删除器,以及boost::function如何存储其函数对象 有没有教这个技巧的教程 使用类型擦除函数对象的运行时成本是多少?思想很简单,您定义一个基类,该基类具有与所需功能的接口,然后从中继承。由于类型擦除类仅使用该接口,因此下面的实际类型将被遗忘并擦除。或者,如果唯一需要的接口可以表示为自由函数,则可以存储指向自由函数的指针 namespace detail { struct deleter_base {

键入擦除-你是这样称呼它的吗

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;
   }
};
名称空间详细信息{
结构删除器库{
虚~deleter_base(){}
虚拟void运算符()(void*)=0;
};
模板
结构deleter:deleter\u base{
虚拟void运算符()(void*p){
删除静态_-cast(p);
}
};
}
模板
简单类{
T*ptr;
细节::deleter_base*deleter;
公众:
模板
简单ptr(U*p){
ptr=p;
deleter=新细节::deleter();
}
~simple_ptr(){
(*删除者)(ptr);
删除删除器;
}
};

这是一个非常简单的智能指针,但其思想是存在的。在
shared\u ptr
的特殊情况下,删除器作为引用计数对象的一部分存储,该对象由指针持有。

shared\u ptr deleter不必从任何东西派生。@pic11:传入
shared\u ptr
的删除器不需要继承,但类型擦除是通过使用继承实现的(或函数指针)内部。如果您不知道函数对象的静态类型和/或它不是从基类继承的,您如何调用函数对象?@pic11:,请看一看,以便了解David在代码中所说的内容。@Anubis先生:举个例子可能更简单:
void f(shared_ptr)
,以及两个共享指针:
shared_ptr p(新int);int i;shared_ptr q(&i,noop_deleter);
(假设适当的删除者)。删除者不参与
shared_ptr
的类型,这意味着您可以同时执行
f(p)
f(q)
。将其与
std::unique_ptr
进行比较,其中删除者是一个模板参数:
void f(唯一的)
,和
唯一的
,然后
f(q)
是一个错误。删除器的类型是智能指针类型的一部分。您在询问之前是否尝试过谷歌搜索?网络上有很多信息。Thamas Becker的旧文章:或这本著名的书:以及许多其他资源。@GeneBushuyev:SO的全部目的基本上是让谷歌搜索变得不必要。如果您如果你想了解一些与编程相关的主题,你可以在谷歌上搜索它,或者(1)找到一个答案,或者(2)得到不可靠的信息,这些信息可能是正确的,也可能是不正确的,可以帮助你。或者你可以(2)在SO上搜索/询问,并获得同行评议的答案,按质量分级,并且实际上保证有用。请不要告诉人们去谷歌而不是在这里提问。这会适得其反。