C++ 使用非静态成员函数为std::unique_ptr设置自定义删除程序

C++ 使用非静态成员函数为std::unique_ptr设置自定义删除程序,c++,C++,如何将成员函数设置为std::unique\u ptr的自定义删除程序 class foo{ public: foo() = default; }; class fooDeleter{ public: fooDeleter() = default; void deleteFoo(foo* f) { cout << "deleting foo" << endl; delete f;

如何将成员函数设置为
std::unique\u ptr
的自定义删除程序

class foo{
public:
    foo() = default;
};

class fooDeleter{
public:
    fooDeleter() = default;
    
    void deleteFoo(foo* f) {
        cout << "deleting foo" << endl;
        delete f;
    }
};


int main() {
    fooDeleter* fd = new fooDeleter;
    using fptr = void (fooDeleter::*)(foo *f);
    fptr p = &fooDeleter::deleteFoo;
    
    std::unique_ptr<foo, fptr> fooptr{nullptr, (fd->*p)}; // syntax error

}
  • 编辑:
    自定义删除器在JNI库中声明为非静态方法,因此我无法更改它。 因此,最终的删除器必须是非静态方法

    • 简短回答-您不能将非静态方法直接用作删除器。这根本不是
      unique\u ptr
      所期望的。您必须使用以下任一选项:

      • 独立函数或静态方法
      • 羔羊
      • 函子(实现了
        运算符()
        的对象)
      例如:

      class-foo{
      公众:
      foo()=默认值;
      };
      void deleteFoo(foo*f){
      
      无法将函数设置为静态。是的,您的示例中没有任何内容使用
      fooDeleter
      中的
      this
      值,因此它应该作为静态类函数工作。伙计们,这只是一个示例。自定义删除器在JNI库中声明为非静态成员函数,因此我无法更改它。我将尝试第三个。感谢您的解释
      foo* f = new foo;
      (fd->*p)(f);