- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我经常使用 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 *
.
另一种解决方案是保留您当前拥有的所有内容,并将以下别名添加到删除器定义中。
using pointer = T;
现在,unique_ptr
将管理 <deleter_type>::pointer
,即 void *
, 而不是 void **
,您的代码将编译。
关于c++ - toUniquePtr 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36679208/
我经常使用 Windows API。每次我获得某种操作系统资源(如句柄、注册表项、套接字等)时,我都会用某种 unique_ptr 手动包装它。以便正确关闭该句柄。 我尝试创建一个轻量级的 toUni
我是一名优秀的程序员,十分优秀!