c++ - 是否有适合 'ownership-in-a-package' 的 'handles' 可用?

标签 c++ c++11 handle raii ownership-semantics

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

查看句柄类型内部以根据此信息进行构造是没有意义的。这是一个句柄,应该无关紧要。

我将在这里引用另一个 SO 用户在 another question's 中的感受answer :

Create a specific "smart pointer" class, won't take long. Don't abuse library classes. Handle semantics is quite different from that of a C++ pointer; for one thing, dereferencing a HANDLE makes no sense.

One more reason to use a custom smart handle class - NULL does not always mean an empty handle. Sometimes it's INVALID_HANDLE_VALUE, which is not the same.

免责声明:

这个问题重新表述并建立在这个问题的基础上:

最佳答案

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

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

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

相关文章:

c++ - 列表初始化的 char 数组是否仍然以 null 结尾?

c++ - 如何编写以对象为参数的可变参数模板函数?

c++ - 为什么我的热插拔 HID 设备应用程序在每次连接时变得越来越慢?

c++ - Cpp 中 Stdio.H header 的结果不均匀

c++ - 如何静态编译 boost_iostreams?

c++ - 如何使用 uint8_t 而不是 char?

c++ - 使用两个以上的参数推导 std::function

c++ - 为什么即使成员函数是 constexpr 也需要 constexpr?

Delphi:检查文件是否正在使用

c# - 如何通过C#释放句柄?