struct FileResource {
explicit FileResource(HANDLE hFile) : _hFile{ hFile } {
if (hFile == INVALID_HANDLE_VALUE) {
Close();
}
}
auto Close() -> void {
if (_hFile) {
CloseHandle(_hFile);
}
}
~FileResource() {
Close();
}
explicit operator bool() const {
return _hFile != INVALID_HANDLE_VALUE;
}
auto get() -> HANDLE {
return _hFile;
}
FileResource(const FileResource &) = delete;
auto operator=(const FileResource &) -> FileResource& = delete;
private:
HANDLE _hFile;
};
auto hFile = FileResource{
CreateFile(fileName1, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr)
};
我试图创建一个智能类,所以我删除了复制构造函数, 但是使用统一的初始化语法我无法构造它; 以下示例有效
处理h; 文件资源 {h};
任何线索;
最佳答案
不要做所有的工作!相反,使用 Rule Of Zero :
struct FileResource
{
explicit FileResource(HANDLE hFile = INVALID_HANDLE_VALUE)
: _hFile(hFile, &::CloseHandle) { }
private:
std::unique_ptr<void, decltype(&::CloseHandle)> _hFile;
};
您可以随心所欲地使用它:
int main()
{
auto hFile = FileResource {
CreateFile("main.cpp", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr)
};
}
关于c++ - 复制构造函数和 UniformInitalization 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22854303/