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用户的感受:



免责声明:

这个问题重新制定并以此为基础:
  • Where's the proper (resource handling) Rule of Zero?
  • 最佳答案

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

    如果您想要一个单独的,具体的C++类型(或类型模板)作为一个句柄,而没有实际定义任何特定的处理语义,那么...我无能为力。我认为任何人都无法做到。

    关于c++ - 是否有适用于 'ownership-in-a-package'的适当 'handles'?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14878121/

    10-11 16:16