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上搜索/询问,并获得同行评议的答案,按质量分级,并且实际上保证有用。请不要告诉人们去谷歌而不是在这里提问。这会适得其反。