模板类来关闭句柄和其他 WINAPI 的?
Template class to close HANDLES and other WINAPI's?
我刚接触C++,需要一些帮助。
到目前为止,我想制作一个处理HANDLE
和其他WINAPI
的模板class
/struct
,代码如下:
template <typename type_to_open, typename returntype, returntype (WINAPI * GlobalFn)(
type_to_open )> class Handle_Wrap {
public:
type_to_open data;
Handle_Wrap (type_to_open in_data) { data = in_data; }
~Handle_Wrap() { returntype (WINAPI * GlobalFn)( type_to_open );}
};
Handle_Wrap <HANDLE, BOOL, ::FindClose> hFind ( FindFirstFileA (pattern.c_str(), &ffd) );
老实说,我认为它不起作用,编译器给了我一个警告:
warning C4101: 'GlobalFn' : unreferenced local variable
我从网上看到了这段代码,并对其进行了一些更改,我不知道这是否是正确的做法?
问题出在析构函数中。你重复声明GlobalFn
,而不是调用它。它应该是:
~HandleWrap() { (*GlobalFn)( data ); }
此外,您想使此类可复制、可移动还是也不如果两者都没有,则应采取措施防止相关编译器生成的默认值;否则,您将需要提供相应的构造函数(并且可能赋值运算符)。如果是可复制的,你还需要一些计数器,在所有副本之间共享,因此只有最后一个析构函数释放句柄。对于可移动(可能是最佳解决方案,如果您可以确定拥有C++11),您将需要一个move构造函数,它可以确保moved-from对象的析构函数是no-op。
使用标准unique_ptr
怎么样
std::unique_ptr<HANDLE, ::FindClose> hFind = FindFirstFileA(...);
(或者类似的东西)。
我怀疑您代码中的问题是,编译器不将GlobalFn
视为函数调用,而是将其视为原型(Most Vexing Parse的另一个"胜利")-您根本不需要使用WINAPI
,只需将其作为模板化的函数指针即可:
模板类Handle_Wrap{。。。~Handle_Wrap(){GlobalFn(数据);}};
您可能还想使用添加operator type_to_open() { return data; }
,这样您就可以使用FindNextFile(hFind, ...)
,而不必依赖于data
是公共的。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 在其他文件中创建类时在 c++ 项目中不起作用
- 类与私有变量的其他类之间的线程安全性
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- WinAPI挂钩鼠标
- GlobalAlloc而不是其他分配方法
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 将执行、作业和WinAPI相乘
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 如何从其他线程 winapi 获取消息
- 是否有一个WinAPI可以从带有可选空格和其他参数的命令行获取文件名
- WM_MOUSEWEEL停止工作,而WinAPI(C++)中的其他事件仍在工作
- ::createFile winApi 失败,出现错误 5 (access_denied).是外壳编程或其他解决方案或任
- 在WinAPI、POSIX或API-OS等价物的其他扩展中,是否存在来自C++11的所有级别的内存屏障
- 模板类来关闭句柄和其他 WINAPI 的?
- 如何仅使用直接 WinAPI 将独立于设备的位图放入 Windows 剪贴板?(无 MFC 或其他包装器)