gpt4 book ai didi

c++ - 如何在非模板类中存储仿函数?

转载 作者:太空狗 更新时间:2023-10-29 21:25:22 24 4
gpt4 key购买 nike

我注意到当我使用 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/

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