对枚举值进行模板化以选择句柄打开/关闭

Templating on Enum Value to Select Handle Open/Close

本文关键字:句柄 选择 关闭 枚举      更新时间:2023-10-16

我正在为一个使用整数表示的句柄的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;
}