【发布时间】:2015-10-07 13:55:53
【问题描述】:
在代码中,我为特定对象定义了 3 个 std::unique_ptr 指针类型:
typedef std::unique_ptr<MyObject> nonConstPtrDefaultDelete;
typedef std::unique_ptr<MyObject, std::function<void(MyObject *)>>
nonConstPtrCustomDelete;
typedef std::unique_ptr<const MyObject, std::function<void(const MyObject *)>>
ConstPtrCustomDelete;
我遇到了一个用例,我需要将 nonConstPtrDefaultDelete 转换为 ConstPtrCustomDelete 并将 nonConstPtrCustomDelete 转换为 ConstPtrCustomDelete。 换句话说:
nonConstPtrDefaultDelete a;
nonConstPtrCustomDelete b;
ConstPtrCustomDelete c1(a); // Compiler error Deleter has incompatible type
ConstPtrCustomDelete c2(b); // Compiler error Deleter has incompatible type
主要问题来自删除功能的类型签名不兼容。可以通过以下方式更改 nonConstPtrCustomDelete 类型的定义来修复 nonConstPtrCustomDelete 情况:
typedef std::unique_ptr<MyObject, std::function<void(const MyObject *)>>
nonConstPtrCustomDelete
但是,使用 DefaultDelete 最常见的情况仍然会产生编译错误,尽管直观上很清楚可以进行转换。 有没有办法解决这个限制并提示编译器函数可以从一个转换到另一个?
谢谢
【问题讨论】:
-
+1 好问题。如果模板化的移动构造函数不能处理这个,它可以处理什么,即它是做什么用的?我不确定。
-
哦。函数
void(T*)不能转换为void(T const*)。我没想到。 -
你真的需要使用
std::function作为删除器吗?不同的unique_ptr实例是否对删除器使用不同的功能,还是它们都使用相同类型的删除器?如果是后者,那么创建一个执行正确操作的自定义删除器对象会更容易,而不是在std::function中存储一些东西。然后您可以在自定义删除器类型之间添加转换,而std::function无法做到这一点