【问题标题】:Is there any standard delete functor?有没有标准的删除函子?
【发布时间】:2015-07-07 03:07:56
【问题描述】:

我正在寻找一个删除其参数的函子:

template<class T>
struct delete_functor
{
    void operator()(T* p)
    {
        delete p;
    }
};

stdtr1boost 中是否有类似的内容?

【问题讨论】:

  • 如果你是自己写的,顺便说一句,那么使用struct delete_functor { template &lt;typename T&gt; void operator()(T* p) { delete p; } };,你不必在创建时指定 T。

标签: c++ functor delete-operator


【解决方案1】:

C++0x 会将std::default_delete 添加到标准库以支持std::unique_ptr

它实际上与您的delete_functor 具有相同的功能,但还专门为数组类型对象调用delete[]

【讨论】:

  • std::default_delete&lt;void&gt;() 是做什么的?
  • @user1095108:如果 operator() 被实例化,程序将不正确。 default_delete 实例化的类型在类模板实例化时可能是不完整的,但在 operator() 实例化时它必须是完整的。
  • @JamesMcNellis 所以必须实例化std::unique_ptr&lt;void, void(*)(void*)&gt; p{ 0, operator delete }; 才能正确删除void*
  • @user1095108:delete 的操作数可能不是void*。如果您尝试 deletevoid*,则程序格式错误。
【解决方案2】:

Boost.Lambda 有delete_ptr and delete_array

【讨论】:

  • #include &lt;boost/lambda/construct.hpp&gt;
【解决方案3】:

我们公司不允许使用boost,我们也没有使用C++11,所以我用这个:

namespace
{
  // - for use to deletion:
  // std::vector<int*> foobar;
  // std::for_each(foobar.begin(), fooabr.end(), del_fun<T>());
  template<class _Type>
  struct del_fun_t:
    public unary_function<_Type*, void>
  {
    void operator()(_Type* __ptr) {
      delete __ptr;
    }
  };

  template<class _Type>
  del_fun_t<_Type> del_fun()
  {
    return del_fun_t<_Type>();
  };
};

我想这就是你要找的。​​p>

您也可以将其重新创建为 dtor_fun_t 并替换 "delete _ptr;"通过“_ptr->~_Type();”只打电话给dtor。例如,您使用内存管理器和放置新的情况就是这种情况。

【讨论】:

    猜你喜欢
    • 2019-01-13
    • 1970-01-01
    • 2011-09-14
    • 2020-06-27
    • 2019-03-30
    • 1970-01-01
    • 2019-09-22
    • 2021-09-26
    • 2016-03-12
    相关资源
    最近更新 更多