除了指针之外,句柄还具有适当的语义。所以对我来说这样的例子(从零规则中提取):
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
等。人。不起作用,我必须对句柄类型是什么做出不必要的假设,而我想要的只是通过不透明的句柄类型及其释放功能获得“包中的所有权”。
在句柄类型内部查看此信息以进行构造是没有意义的。是把手,应该没关系。
创建一个特定的“智能指针”类,不会花很长时间。不要滥用图书馆课程。句柄语义与 C++ 指针的语义完全不同;一方面,取消引用 HANDLE 是没有意义的。
使用自定义智能句柄类的另一个原因 - NULL 并不总是意味着空句柄。有时是INVALID_HANDLE_VALUE,不一样。
免责声明:
这个问题重新制定并建立在这个问题之上: