我注意到当我使用 std::shared_ptr
时(或任何其他智能指针)自定义分配器/删除器是通过 ctor 分配的,它恰好是一个模板。我的问题是:分配器/删除器是如何存储和使用的?
这些仿函数是否存储为函数指针,void*
, 还是什么?是间接调用,还是直接调用?
为了更清楚地了解我要问的问题,请考虑以下代码:
struct SomethingAwesomeDeleter
{
public:
void operator()(SomethingAwesome* ptr) const
{
// do something awesome
delete ptr;
}
};
typedef std::shared_ptr<SomethingAwesome> SomethingAwesomePtr;
SomethingAwesomePtr ptr{new SomethingAwesome, SomethingAwesomeDeleter{}};
如何SomethingAwesomeDeleter{}
存储和使用?
注意:
我确实意识到 std::shared_ptr
是一个模板类,但是std::shared_ptr
在类模板参数中没有删除器/分配器的模板参数,即不存在 std::shared_ptr<T, Allocator, Deleter>
这样的模板类.
最佳答案
您可以在 std::function
中存储任何函数对象。这负责直接存储函数指针(如果它是一个普通函数)或将其包装在某个对象中。这是实现 shared_ptr
删除器的一种可能方法,而无需将函数类型作为模板类型的一部分。
示例(未经测试,仅供引用)
// This is the struct which actually holds the shared pointer
// A shared_ptr would reference count this
template <typename T>
class shared_ptr_shared
{
std::function<void (T*)> del_;
T* p_;
// other members
template <typename Deleter>
shared_ptr_shared (T* obj, Deleter deleter)
: p_ (p)
, del_ (deleter)
{
}
~shared_ptr_shared ()
{
if (del_) {
del_ (p_);
} else {
delete p_;
}
}
};
你可以在这里找到更多关于 std::function 的信息:how boost::function and boost::bind work
关于c++ - 如何在非模板类中存储仿函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14109466/