Handles除了指针外还具有适当的语义。因此,对我来说,这样的示例(从Rule of Zero中提取):
class module {
public:
explicit module(std::wstring const& name)
: handle { ::LoadLibrary(name.c_str()), &::FreeLibrary } {}
// other module related functions go here
private:
using module_handle = std::unique_ptr<void, decltype(&::FreeLibrary)>;
module_handle handle;
};
将
unique_ptr
用作“包装中的所有权”句柄是一个不好的例子。首先,它利用内部知识,即句柄是指针类型,并使用此知识将unique_ptr
转换为“不透明”句柄类型所基于的基本类型。句柄可以是任何类型,它们可以是指针,它们可以是索引或谁知道。最重要的是,您手头的东西(例如,从大多数C API中获得)是一个句柄及其资源释放功能。
是否存在可以处理句柄语义的适当“包装中的所有权”?我的意思是,已经可以公开使用了吗?
对我来说,
unique_ptr
等。 al。不起作用,我必须对句柄类型是做出不必要的假设,而我想要的仅仅是通过不透明的句柄类型及其释放函数获得“包装中的所有权”。窥探句柄类型以根据此信息进行构造是没有意义的。这是一个句柄,没关系。
我将在another question's answer中引用另一个SO用户的感受:
免责声明:
这个问题重新制定并以此为基础:
最佳答案
unique_ptr
类型不如短语“handle”通用,是的。但是为什么不呢?只是您的“句柄”示例之一(例如,它是一个整数索引),与unique_ptr
一样通用。您无法将一种特定类型的 handle 与“所有 handle ”进行比较。
如果您想要一个单独的,具体的C++类型(或类型模板)作为一个句柄,而没有实际定义任何特定的处理语义,那么...我无能为力。我认为任何人都无法做到。
关于c++ - 是否有适用于 'ownership-in-a-package'的适当 'handles'?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14878121/