【问题标题】:How do I store functors in non-template classes?如何将函子存储在非模板类中?
【发布时间】:2012-12-16 01:51:24
【问题描述】:

我注意到,当我使用 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&lt;T, Allocator, Deleter&gt; 这样的模板类。

【问题讨论】:

  • 没有你描述的这样的模板类decl,你是对的。但是对于shared_ptr 构造函数,这样的模板覆盖(对于shared_ptr,有一个constructor overridesboatload)。关于存储,我想它是实现定义的,但我见过的大多数实现将它们存储为 shared_ptr 的实例成员或类似的东西。我可能(并且可能)错了,因为我不熟悉标准是否规定了所述对象的实际存储细节。

标签: c++ c++11 storage functor


【解决方案1】:

您可以将任何函数对象存储在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

【讨论】:

  • 也就是说,间接调用。好吧,我想我已经预料到了。
  • 是的,没有间接调用无法解决的问题;)
猜你喜欢
  • 2014-10-24
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
相关资源
最近更新 更多