saj*_*jas 4 c++ smart-pointers shared-ptr delete-operator c++11
我的项目中有以下课程
class Base
{
public:
virtual ~Base(){};
}
class Der1: public Base
{
public:
virtual ~Der1(){};
}
class Der2: public Base
{
public:
virtual ~Der2(){};
}
Run Code Online (Sandbox Code Playgroud)
我持有这些类的对象为std::shared_ptr
.我需要为所有类型Base
或任何类型的对象提供自定义删除器derived types
.
我想在删除方法中使用的代码将为所有这些对象做同样的事情,比方说
class Deleter
{
public:
void operator()( Base * b )
{
//Do something
delete b;
}
}
Run Code Online (Sandbox Code Playgroud)
而不是在每个对象的构造过程中提供删除器
std::shared_ptr< Der1 > pDer1( new Der1(), Deleter() );
std::shared_ptr< Der2 > pDer2( new Der2(), Deleter() );
Run Code Online (Sandbox Code Playgroud)
有没有办法指定类似"对于所有类型为Base的对象的共享指针或其派生类型Deleter
用于删除的东西?由于删除类只是在shared_ptr的构造函数中采用,如何有人为特定类型指定删除器?
我在Base中编写了一个创建/工厂函数,返回shared_ptr以获取正确的派生类型.这样的效果:
class Base
{
//...public...
template <class Derived>
static std::shared_ptr<Base> create()
{
return std::shared_ptr<Base>(new Derived, Deleter());
}
};
Run Code Online (Sandbox Code Playgroud)
编辑:功能需要是静态的......
如果派生有多个参数,则可以使用可变参数模板和完美转发来解决.
编辑:
像这样(对于多个参数派生构造函数):
#include <iostream>
#include <memory>
struct Base;
struct Deleter
{
void operator()(Base* b);
};
struct Base
{
//...public...
template <class Derived, class ... Args>
static std::shared_ptr<Base> create(Args&&... args)
{
return std::shared_ptr<Base>(new Derived(std::forward<Args>(args)...), Deleter());
}
virtual ~Base(){}
};
void Deleter::operator()(Base* b){ delete b; }
struct Derived : Base
{
Derived(int a, int b, int c)
{
}
};
int main() {
std::shared_ptr<Base> p = Base::create<Derived>(1,2,3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
376 次 |
最近记录: |