C++ 是否可以减少类型转换的写入?
假设您在Windows上使用C++ 是否可以减少类型转换的写入?,c++,templates,casting,C++,Templates,Casting,假设您在Windows上使用dlopen()或LoadLibrary()加载了一个动态库,并且希望从中获取一个符号并将其强制转换为特定的函数类型。这是如此令人难以置信的冗余写两次类型 void (*Test)(int, float) = reinterpret_cast<void (*Test)(int, float)>(dlsym(handle, "Test")); 有没有办法减少代码中的冗余?当从动态加载的库中检索大量函数时,每次强制转换写两次是很糟糕的 您可以
dlopen()
或LoadLibrary()
加载了一个动态库,并且希望从中获取一个符号并将其强制转换为特定的函数类型。这是如此令人难以置信的冗余写两次类型
void (*Test)(int, float) =
reinterpret_cast<void (*Test)(int, float)>(dlsym(handle, "Test"));
有没有办法减少代码中的冗余?当从动态加载的库中检索大量函数时,每次强制转换写两次是很糟糕的 您可以使用一个邪恶的模板转换操作符来实现这一点
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));
}
struct代理{
公众:
代理(void*ptr):ptr(ptr){}
模板
运算符T()常量{
返回重新解释(ptr);
}
私人:
无效*ptr;
};
代理GetSym(void*handle,const char*symbol){
返回代理(dlsym(句柄,符号));
}
您认为为什么添加了自动
?您使用的是哪种编译器?它是否有类似于gcc
的typeof
扩展?@brianbeuning不会有多大帮助,可以有这么多不同的函数签名,并定义每个变体的类型。。哎哟,这甚至不是一个合法的强制转换,因为函数指针和对象指针不能保证有任何共同的布局或大小。我能想到的最好办法是将从dlsym
中得到的无效指针memcpy到函数指针中。@Kerrek在dlsym
存在的平台上也可以。FWIW,POSIX规范本身建议使用void(*TestFN)(int,float)*(无效**)(&fptr)=dlsym(手柄,sym)相反,我觉得这很可笑,说实话。reinterpret_cast有条件地得到实现定义的结果的支持(相关的实现支持预期的结果)。POSIX规范建议的黑客通过对错误类型的引用访问左值(即违反严格的别名规则)
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));
}