假设您在Windows上使用dlopen()
或LoadLibrary()
加载了动态库,并且希望从中获取符号并将其转换为特定的函数类型。两次写入类型是多么令人难以置信的冗余!
void (*Test)(int, float) =
reinterpret_cast<void (*Test)(int, float)>(dlsym(handle, "Test"));
我希望代码在没有C ++ 11标准的情况下可编译,因此auto
关键字不是一个选项。我尝试使用模板,因为编译器通常可以从给定的参数中检测模板参数,但它似乎不适用于赋值的类型。
template <typename T>
T GetSym(void* handle, const char* symbol) {
return (T) dlsym(handle, symbol);
}
void (*Test)(int, float) = GetSym(handle); // does not compile
有没有办法减少代码中的冗余?从动态加载的库中检索大量函数时,每次编写两次演员都很糟糕!
答案 0 :(得分:2)
您可以使用邪恶的模板化转换运算符执行此操作。
struct proxy {
public:
proxy(void* ptr) : ptr(ptr) {}
template <typename T>
operator T() const {
return reinterpret_cast<T>(ptr);
}
private:
void* ptr;
};
proxy GetSym(void* handle, const char* symbol) {
return proxy(dlsym(handle, symbol));
}