对枚举值进行模板化以选择句柄打开/关闭
Templating on Enum Value to Select Handle Open/Close
我正在为一个使用整数表示的句柄的C库编写C++包装器。有一堆开放函数(Aopen、Bopen、Copen、Dopen、Eopen…)和相应的关闭函数(Aclose、Bclose、Ccloe、Dcloe、Eclose…)。我目前有实现基本RAII的包装器类,但我有一些代码重复,因为每个包装器只在调用哪个打开和关闭例程方面不同。为了消除这种重复,我考虑在我为每个例程(例如Atype、Bytpe等)定义的枚举上模板化,然后在编译时选择正确的打开和关闭函数。它想要这样的东西:
TypeWrapper<AType> wrapped_a(...)
TypeWrapper<BType> wrapped_b(...)
...
这是一种合理的方法吗,有没有更简单的方法,或者这种类型的结构有名字吗?
谢谢!
您可以执行以下操作:
template <typename H, H Open(const char*), void Close(H)>
class Wrapper
{
public:
Wrapper(const char* file) : h(Open(file)) {}
~Wrapper() { Close(h); }
Wrapper(const Wrapper&) = delete;
Wrapper& operator = (const Wrapper&) = delete;
private:
H h;
};
然后using Wrapper_A = Wrapper<AHandle, AOpen, AClose>;
实例
您想要的是模板专业化。
基本上,这是通过在枚举值上模板化TypeWrapper类来完成的,然后为每个枚举值的打开/关闭调用提供专门的实现。
一个例子胜过千言万语:实例
#include <iostream>
using namespace std;
enum Type {
AType = 0,
BType,
CType,
};
void AOpen() { std::cout << "A open." << std::endl; }
void BOpen() { std::cout << "B open." << std::endl; }
void COpen() { std::cout << "C open." << std::endl; }
template<Type T>
class TypeWrapper {
public:
void open();
void close();
};
template<>
void TypeWrapper<AType>::open() { AOpen(); }
template<>
void TypeWrapper<BType>::open() { BOpen(); }
template<>
void TypeWrapper<CType>::open() { COpen(); }
int main() {
TypeWrapper<AType> wrapped_a;
TypeWrapper<BType> wrapped_b;
wrapped_a.open();
wrapped_b.open();
return 0;
}
相关文章:
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 如何获取边缘窗口句柄 (HWND)?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 c/c++ 中打开 PhysicalDrive 的句柄并写入 MBR 的 linux 等效是什么?
- 从运行服务的应用程序代码中提取窗口句柄
- 在读取文件后重置句柄
- 是否有像地图这样的C++结构,但我得到的不是值的键,而是值的句柄?
- Microsoft ODBC 无法创建有效的句柄
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 获取特定进程的句柄数
- C++ 创建 NdisProt 驱动程序的句柄
- 是否需要关闭来自 WinHTTP 异步的句柄?
- 句柄OK全部崩溃
- 我需要通过窗口句柄(HWND)获取文件,我该怎么办?
- 什么是 C# 等同于C++句柄
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- 获取现有进程句柄
- GetModuleHandle() 无法检索由 "notepad.exe" 加载的"advapi32.dll"的句柄
- 对枚举值进行模板化以选择句柄打开/关闭
- 如何根据要写入的数据类型动态选择文件句柄