5

除了指针之外,句柄还具有适当的语义。所以对我来说这样的例子(从零规则中提取):

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等。人。不起作用,我必须对句柄类型什么做出不必要的假设,而我想要的只是通过不透明的句柄类型及其释放功能获得“包中的所有权”。

在句柄类型内部查看此信息以进行构造是没有意义的。是把手,应该没关系。

我将在另一个问题的 答案中引用另一个 SO 用户的感受:

创建一个特定的“智能指针”类,不会花很长时间。不要滥用图书馆课程。句柄语义与 C++ 指针的语义完全不同;一方面,取消引用 HANDLE 是没有意义的。

使用自定义智能句柄类的另一个原因 - NULL 并不总是意味着空句柄。有时是INVALID_HANDLE_VALUE,不一样。

免责声明:

这个问题重新制定并建立在这个问题之上:

4

2 回答 2

2

类型unique_ptr不如短语“handle”通用,是的。但为什么不应该呢?您的“句柄”示例之一(例如,整数索引的示例)与unique_ptr. 您无法将一种特定类型的句柄与“所有句柄”进行比较。

如果你想要一个单一的、具体的 C++ 类型(或类型模板),它是一个句柄,但实际上没有定义任何特定的处理语义,那么......我帮不了你。我认为没有人可以轻松应对。

于 2013-02-14T15:30:20.550 回答
0

std::experimental::unique_resource

于 2013-02-15T20:35:06.627 回答