为 std::shared_ptr 指定一个适用于特定类型或其派生类型的所有对象的删除器
Specifying a Deleter for std::shared_ptr that works on all objects of a particular type or its derived types
我的项目中有以下 classes
class Base
{
public:
virtual ~Base(){};
}
class Der1: public Base
{
public:
virtual ~Der1(){};
}
class Der2: public Base
{
public:
virtual ~Der2(){};
}
我持有这些 classes 的对象为 std::shared_ptr
。我需要为 Base
类型或其任何 derived types
.
类型的所有对象提供自定义删除器
我想要的删除方法中的代码将对所有这些对象做同样的事情,比如说
class Deleter
{
public:
void operator()( Base * b )
{
//Do something
delete b;
}
}
而不是像
那样在每个对象的构造过程中提供删除器
std::shared_ptr< Der1 > pDer1( new Der1(), Deleter() );
std::shared_ptr< Der2 > pDer2( new Der2(), Deleter() );
有没有办法指定类似“所有指向 Base 类型或其派生类型的对象的共享指针使用 Deleter
删除?
由于删除器 class 只是在 shared_ptr 的构造函数中使用,因此有人如何为特定类型指定删除器?
我会在 Base 中编写一个 creation/factory 函数,为正确的派生类型返回 shared_ptr。达到这个效果的东西:
class Base
{
//...public...
template <class Derived>
static std::shared_ptr<Base> create()
{
return std::shared_ptr<Base>(new Derived, Deleter());
}
};
编辑:函数需要是静态的...
如果derived有多个参数,可以通过可变参数模板和完美转发来解决。
编辑:
像这样(对于多参数派生构造函数):
#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;
}
我的项目中有以下 classes
class Base
{
public:
virtual ~Base(){};
}
class Der1: public Base
{
public:
virtual ~Der1(){};
}
class Der2: public Base
{
public:
virtual ~Der2(){};
}
我持有这些 classes 的对象为 std::shared_ptr
。我需要为 Base
类型或其任何 derived types
.
我想要的删除方法中的代码将对所有这些对象做同样的事情,比如说
class Deleter
{
public:
void operator()( Base * b )
{
//Do something
delete b;
}
}
而不是像
那样在每个对象的构造过程中提供删除器std::shared_ptr< Der1 > pDer1( new Der1(), Deleter() );
std::shared_ptr< Der2 > pDer2( new Der2(), Deleter() );
有没有办法指定类似“所有指向 Base 类型或其派生类型的对象的共享指针使用 Deleter
删除?
由于删除器 class 只是在 shared_ptr 的构造函数中使用,因此有人如何为特定类型指定删除器?
我会在 Base 中编写一个 creation/factory 函数,为正确的派生类型返回 shared_ptr。达到这个效果的东西:
class Base
{
//...public...
template <class Derived>
static std::shared_ptr<Base> create()
{
return std::shared_ptr<Base>(new Derived, Deleter());
}
};
编辑:函数需要是静态的...
如果derived有多个参数,可以通过可变参数模板和完美转发来解决。
编辑:
像这样(对于多参数派生构造函数):
#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;
}