用unique_ptr和自定义删除器包装C代码

Ela782

我正在尝试在智能指针中包装来自OpenCV的C-API(CvPOSITObject)的对象。据我了解,它应该类似于以下内容:

unique_ptr<CvPOSITObject, decltype(cvReleasePOSITObject)> positObject;
positObject = unique_ptr<CvPOSITObject, decltype(cvReleasePOSITObject)>(cvCreatePOSITObject(param1, param2), cvReleasePOSITObject);

但是我遇到了编译器错误,而google并没有真正的帮助。

这两个函数的声明是:

CVAPI(CvPOSITObject*)  cvCreatePOSITObject( CvPoint3D32f* points, int point_count );
CVAPI(void)  cvReleasePOSITObject( CvPOSITObject**  posit_object );

我得到类似

1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1227): error C2207: 'std::_Unique_ptr_base<_Ty,_Dx,_Empty_deleter>::_Mydel' : a member of a class template cannot acquire a function type
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1322): warning C4180: qualifier applied to function type has no meaning; ignored
1>  Myfile.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1221): warning C4180: qualifier applied to function type has no meaning; ignored
1>          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1283) : see reference to class template instantiation 'std::_Unique_ptr_base<_Ty,_Dx,_Empty_deleter>' being compiled
1>          with
1>          [
1>              _Ty=CvPOSITObject,
1>              _Dx=void (CvPOSITObject **),
1>              _Empty_deleter=false
1>          ]
1>          C:\MyDir\Myfile.hpp(71) : see reference to class template instantiation 'std::unique_ptr<_Ty,_Dx>' being compiled
1>          with
1>          [
1>              _Ty=CvPOSITObject,
1>              _Dx=void (CvPOSITObject **)
1>          ]

我如何正确地做到这一点?

普雷托里亚人

您的代码有两个问题。正如BenVoigt在他的回答中提到的,第一个decltype不会触发从函数类型到指针到函数类型的隐式转换,因此您必须显式获取函数的地址。您的代码更改为

positObject = unique_ptr<CvPOSITObject, 
                         decltype(&cvReleasePOSITObject)>(
                         cvCreatePOSITObject(param1, param2), 
                         cvReleasePOSITObject);

但是,由于其他原因,现在将无法编译,这使我们遇到了第二个问题。cvReleasePOSITObject接受类型的参数,CvPOSITObject **但是unique_ptr以上方法将尝试使用调用其删除器CvPOSITObject *要解决此问题,只需对删除程序使用lambda表达式。

positObject = unique_ptr<CvPOSITObject, 
                         void(*)(CvPOSITObject *)>(
                         cvCreatePOSITObject(param1, param2), 
                         [](CvPOSITObject *p) { cvReleasePOSITObject(&p); });

如果要分开声明和初始化,则unique_ptr有两个选项。第一个示例演示如何为此使用lamda表达式。

auto deleter = [](int *p) {
    delete p;
};

int main()
{
    std::unique_ptr<int, decltype(deleter)> p(nullptr, deleter);    
    p.reset(new int(42));
}

您仍然必须将Deleter实例传递给unique_ptr,否则它将尝试默认构造Deleter,这会失败,因为从lambda表达式生成的闭包已删除了默认构造函数(N3691中的§5.1.2/ 20)。

另一种选择是将删除程序写为函子,从而允许默认构造。

struct deleter
{
    void operator()(int *p) const
    {
        delete p;
    }
};

int main()
{
    std::unique_ptr<int, deleter> p;

    p.reset(new int(42));
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

std :: unique_ptr <T []>和自定义分配器删除器

来自分类Dev

如何将自定义删除器与std :: unique_ptr成员一起使用?

来自分类Dev

具有自定义删除程序类的STL向量和unique_ptr

来自分类Dev

使用std :: function对象将自定义删除器传递给std :: unique_ptr

来自分类Dev

使用带有unique_ptr的自定义删除器

来自分类Dev

Typedef一个带有静态自定义删除器的shared_ptr类型,类似于unique_ptr

来自分类Dev

混淆使用unique_ptr和自定义删除器

来自分类Dev

unique_ptr,自定义删除器和零规则

来自分类Dev

具有自定义指针类型的unique_ptr:* get()和operator *()给出不同的输出

来自分类Dev

具有自定义删除器的unique_ptr构造函数被删除

来自分类Dev

将具有自定义删除器的unique_ptr移到shared_ptr

来自分类Dev

std :: unique_ptr使用带有很少参数的自定义删除器

来自分类Dev

如何为包装需要2个参数的ac函数的unique_ptr类成员创建自定义删除器?

来自分类Dev

C ++ 11使用unique_ptr和自定义删除器

来自分类Dev

自定义删除程序以通过std :: unique_ptr释放2D数组

来自分类Dev

智能指针(unique_ptr)自定义删除器错误C2027和C2338

来自分类Dev

我可以使用自定义删除器简洁地声明std :: unique_ptr吗?

来自分类Dev

具有unique_ptr成员和自定义析构函数的对象的向量

来自分类Dev

如何制作将函数包装在noexcept可检测的可调用对象中的类模板,以用作std :: unique_ptr自定义删除器?

来自分类Dev

配备有功能指针作为自定义删除器的unique_ptr是否与shared_ptr大小相同?

来自分类Dev

了解采用自定义删除器的unique_ptr的构造函数

来自分类Dev

使用std :: function对象将自定义删除器传递给std :: unique_ptr

来自分类Dev

Typedef一个带有静态自定义删除器的shared_ptr类型,类似于unique_ptr

来自分类Dev

初始化传递给unique_ptr自定义删除器的函子

来自分类Dev

使用typedef为std :: unique_ptr指定自定义默认删除器

来自分类Dev

带有lambda自定义删除程序的std :: unique_ptr无法编译

来自分类Dev

std :: unique_ptr,自定义删除器和类型更改

来自分类Dev

unique_ptr 的有状态自定义删除器

来自分类Dev

如何为由 unique_ptr 管理的数组编写自定义删除器?

Related 相关文章

  1. 1

    std :: unique_ptr <T []>和自定义分配器删除器

  2. 2

    如何将自定义删除器与std :: unique_ptr成员一起使用?

  3. 3

    具有自定义删除程序类的STL向量和unique_ptr

  4. 4

    使用std :: function对象将自定义删除器传递给std :: unique_ptr

  5. 5

    使用带有unique_ptr的自定义删除器

  6. 6

    Typedef一个带有静态自定义删除器的shared_ptr类型,类似于unique_ptr

  7. 7

    混淆使用unique_ptr和自定义删除器

  8. 8

    unique_ptr,自定义删除器和零规则

  9. 9

    具有自定义指针类型的unique_ptr:* get()和operator *()给出不同的输出

  10. 10

    具有自定义删除器的unique_ptr构造函数被删除

  11. 11

    将具有自定义删除器的unique_ptr移到shared_ptr

  12. 12

    std :: unique_ptr使用带有很少参数的自定义删除器

  13. 13

    如何为包装需要2个参数的ac函数的unique_ptr类成员创建自定义删除器?

  14. 14

    C ++ 11使用unique_ptr和自定义删除器

  15. 15

    自定义删除程序以通过std :: unique_ptr释放2D数组

  16. 16

    智能指针(unique_ptr)自定义删除器错误C2027和C2338

  17. 17

    我可以使用自定义删除器简洁地声明std :: unique_ptr吗?

  18. 18

    具有unique_ptr成员和自定义析构函数的对象的向量

  19. 19

    如何制作将函数包装在noexcept可检测的可调用对象中的类模板,以用作std :: unique_ptr自定义删除器?

  20. 20

    配备有功能指针作为自定义删除器的unique_ptr是否与shared_ptr大小相同?

  21. 21

    了解采用自定义删除器的unique_ptr的构造函数

  22. 22

    使用std :: function对象将自定义删除器传递给std :: unique_ptr

  23. 23

    Typedef一个带有静态自定义删除器的shared_ptr类型,类似于unique_ptr

  24. 24

    初始化传递给unique_ptr自定义删除器的函子

  25. 25

    使用typedef为std :: unique_ptr指定自定义默认删除器

  26. 26

    带有lambda自定义删除程序的std :: unique_ptr无法编译

  27. 27

    std :: unique_ptr,自定义删除器和类型更改

  28. 28

    unique_ptr 的有状态自定义删除器

  29. 29

    如何为由 unique_ptr 管理的数组编写自定义删除器?

热门标签

归档