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)
};
我试图创建一个智能类,所以我删除了复制构造函数, 但是使用统一初始化语法我无法构造它; 以下示例有效
HANDLE h; FileResource {h};
任何线索;
答案 0 :(得分:2)
不要做所有的工作!相反,请使用 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)
};
}
答案 1 :(得分:0)
你的意思是你无法做到吗?
FileResource f = {h};
如果是,则是因为您删除了FileResource复制构造函数。 {h}有兴趣构建一个临时结构FileResource然后使用复制构造函数来初始化f。如果你坚持,你应该使用:FileResource f =h