gpt4 book ai didi

c++ - 为 std::shared_ptr 指定一个删除器,它适用于特定类型或其派生类型的所有对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:12 28 4
gpt4 key购买 nike

我的项目中有以下类

class Base
{
public:
virtual ~Base(){};
}

class Der1: public Base
{
public:
virtual ~Der1(){};
}

class Der2: public Base
{
public:
virtual ~Der2(){};
}

我将这些类的对象保存为 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 进行删除?由于删除器类只是在 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());
}
};

编辑:函数需要是静态的...

如果 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;
}

关于c++ - 为 std::shared_ptr 指定一个删除器,它适用于特定类型或其派生类型的所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30498273/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com