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/