c++ - 复制构造函数和 UniformInitalization 列表

标签 c++ winapi c++11

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)
    };
}

查看 Live On Coliru

关于c++ - 复制构造函数和 UniformInitalization 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22854303/

相关文章:

c++ - 如何使用 Windows API 确定注册表值数据的大小?

c++ - 未定义对 "***"的引用

c++ - 将具有任意参数和占位符的函数存储在类中并稍后调用

c# - 从 c++11 time_t 创建一个可转换为 .net DateTime 的字符串

c++ - 将 boost 类型删除类型转换回原始类型给我 boost::bad_any_cast

c++ - 为什么 strlen() 比手动循环检查空终止字符快大约 20 倍?

c++ - std::tr1::bind() 几个编译错误

windows - WSAEventSelect,零事件

c++ - 在 Arduino 上从字符串中提取整数

c++ - 如何纠正 GDI 资源泄漏?