gpt4 book ai didi

c++ - 智能指针自定义删除器

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:40 25 4
gpt4 key购买 nike

仅出于教育目的,我正在编写一个小型智能指针类,目前不是共享类,只是像 C++ 11 中的 unique_ptr 这样的简单类。我想要的不是一个完整的工作实现,而只是基础、创造、默认/自定义删除等。

我一直在尝试查看 Microsoft visual studio 中标准的实现,我确实了解了一般实现,但我被卡住了使用默认/自定义删除。所以我的问题是,实现这种功能的最佳技术是什么?

是否可以仅出于教育目的轻松实现它,或者最终它太复杂而不值得?

干杯

嗨,阿米,

你怎么看待这样的事情?

template <class _Ty>
struct default_delete
{

constexpr default_delete() = default;

void operator()(_Ty* Ptr)
{

std::cout << "Default Delete" << std::endl;

}

};


template <class T, class _Dl=default_delete<T>>
class Smart_Pointer2_Base;

template <class T, class _Dl>
class Smart_Pointer2_Base
{
T *ptr; // Actual pointer
_Dl _deleter;
public:
// Constructor
explicit Smart_Pointer2_Base(T *p = NULL) { ptr = p; }

Smart_Pointer2_Base(T* p, _Dl) { prt = p; _deleter = _Dl; }

// Destructor
~Smart_Pointer2_Base() { _deleter(ptr);}

// Overloading dereferencing operator
T & operator * () { return *ptr; }


T * operator -> () { return ptr; }
};


int main()
{

struct CloserStruct {
void operator()(int* toDelete) { std::cout << "Custom Delete"<<std::endl; }
};
smtpr::Smart_Pointer2_Base<int, CloserStruct> pi(new int(5));

return 0;
}

最佳答案

这使用了一种叫做 type erasure 的东西.虽然有 C++ 库可以做到这一点(例如 boost::any ),但在这种情况下并不太难。

假设您有一些自定义删除器:

struct deleter
{
void operator()(void *)
{
cout << "deleting" << endl;
// Do some other stuff.
}
};

但是您希望支持具有相同签名的其他人,而不是强制您的用户在他们自己的代码中使用虚函数。

首先定义一个基类:

struct base_deleter_holder
{
virtual void delete_it(void *p) = 0;
};

您的类将包含指向该基类的指针。

现在编写一个依赖于实际删除器类型的派生类:

template<class Deleter>
struct deleter_holder :
public base_deleter_holder
{
Deleter m_d;

explicit deleter_holder(const Deleter &d) : m_d(d)
{}
virtual void delete_it(void *p)
{
m_d(p);
}
};

您可以添加实用函数来帮助您创建其类型的对象:

template<class Deleter>
base_deleter_holder *make_deleter_holder(const Deleter &d)
{
return new deleter_holder<Deleter>(d);
}

现在,当有人使用删除器调用您的模板函数时,您可以创建实际的派生类型,并将其存储在您的类中的基指针中。使用虚函数,可以使用基指针调用派生类的方法:

    deleter d;

// pd should be a member of your pointer class.
base_deleter_holder *pd = make_deleter_holder(d);

// Here's how to use it.
pd->delete_it(nullptr);

完整示例:

#include <functional> 
#include <iostream>


using namespace std;


struct base_deleter_holder
{
virtual void delete_it(void *p) = 0;
};


template<class Deleter>
struct deleter_holder :
public base_deleter_holder
{
Deleter m_d;

explicit deleter_holder(const Deleter &d) : m_d(d)
{}
virtual void delete_it(void *p)
{
m_d(p);
}
};


struct deleter
{
void operator()(void *)
{
cout << "deleting" << endl;
}
};


template<class Deleter>
base_deleter_holder *make_deleter_holder(const Deleter &d)
{
return new deleter_holder<Deleter>(d);
}


int main()
{
deleter d;
base_deleter_holder *pd = make_deleter_holder(d);
pd->delete_it(nullptr);
}

关于c++ - 智能指针自定义删除器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35451775/

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