gpt4 book ai didi

c++ - toUniquePtr 实现

转载 作者:行者123 更新时间:2023-11-30 01:44:09 26 4
gpt4 key购买 nike

我经常使用 Windows API。每次我获得某种操作系统资源(如句柄、注册表项、套接字等)时,我都会用某种 unique_ptr<HandleType,SomeDeleter> 手动包装它。以便正确关闭该句柄。

我尝试创建一个轻量级的 toUniquePtr获取句柄和关闭函数并自动创建 unique_ptr 的函数两者之中。

例如:

auto ptr = CreateFile(/**/);
auto unique = toUniquePtr(ptr,&CloseHandle);

到目前为止我的实现:

template <class T, class ClosingFunction>
struct CostumeDeleter {

ClosingFunction closingFunction;

CostumeDeleter(ClosingFunction closingFunction_) :
closingFunction(closingFunction_) {}

CostumeDeleter(const CostumeDeleter&) = default;
CostumeDeleter(CostumeDeleter&&) = default;

void operator() (T t) {
closingFunction(t);
}
};

template <class T, class F>
inline auto toUniquePtr(T t, F f) {
CostumeDeleter<T, F> deleter(f);
std::unique_ptr<T, decltype(deleter)> pointer(t, deleter);
return std::move(pointer);
}

使用示例+编译错误*:

void* handle = malloc(100);
auto ptr = toUniquePtr(handle, &free);

我从 visual studio 2015 RTM 1 得到的错误:

Error   C2664   'std::unique_ptr<T,CostumeDeleter<T,F>>::unique_ptr(const std::unique_ptr<T,CostumeDeleter<T,F>> &)': cannot convert argument 1 from 'void *' to 'void *'

这很奇怪。有帮助吗?

*不,我实际上并没有使用malloc在我使用 C++ 的日常工作中,它只是为了示例,因为它是一个简单的函数来复制编译错误。

最佳答案

template <class T, class F>
inline auto toUniquePtr(T t, F f)

给定上面的函数模板,T被推断为 void * .所以std::unique_ptr<T, decltype( deleter )>期望通过 T * , 又名 void ** .

要修复错误,请将模板更改为

template <class T, class F>
inline auto toUniquePtr(T *t, F f)
// ^^^^

同样,改变删除器的operator()接受T * .

Live demo


另一种解决方案是保留您当前拥有的所有内容,并将以下别名添加到删除器定义中。

  using pointer = T;

现在,unique_ptr将管理 <deleter_type>::pointer ,即 void * , 而不是 void ** ,您的代码将编译。

Live demo

关于c++ - toUniquePtr 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36679208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com