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

标签 c++ c++11 storage functor

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

相关文章:

c++ - 从基调用派生类的隐藏(非虚拟)方法

c++ - 用更好的语法/命名扩展 Eigen

c++ - LLVM 拒绝编译 C++ 源代码,奇怪的错误

c++ - lambda如何捕获结构的成员

google-cloud-platform - 为 Google Cloud Storage 中存储桶中的所有对象设置元数据

python - 我应该为我的 Python 库使用什么后备存储引擎?

c++ - 如果元素存在于对 vector 中,则在类中查找

c++11 - 头文件中定义的函数的重复符号

c++字符串使用assign函数和直接使用 '='改变值的区别

c - C (C89) 中十进制数的有效磁盘存储