函数指针void*
由dlsym()
加载,我可以将其转换为std::function
吗?
假设lib中的函数声明是
int func(int);
using FuncType = std::function<int(int)>;
FuncType f = dlsym(libHandle, "func"); // can this work?
FuncType f = reinterpret_cast<FuncType>(dlsym(libHandle, "func")); // how about this?
答案 0 :(得分:14)
不,函数类型int(int)
和类类型std::function<int(int)>
是两种不同的类型。每当使用dlsym
时,必须将结果指针仅转换为指向符号实际类型的指针。但在那之后,你可以用它做你想做的事。
特别是,您可以从指向函数的指针构造或分配std::function
:
using RawFuncType = int(int);
std::function<int(int)> f{
reinterpret_cast<RawFuncType*>(dlsym(libHandle, "func")) };
答案 1 :(得分:0)
写下这样的东西:
template<class T>
T* dlsym_ptr(void* handle, char const* name) {
return static_cast<T*>( dlsym( handle, name ) );
}
然后:
FuncType f = dlsym_ptr<int(int)>(libHandle, "func");
工作,并将演员阵容隔离成辅助函数。
请注意,从void*
转换为其他指针类型时,请使用static_cast
。只有在没有其他功能时才使用reinterpret_cast
,static_cast
显式允许您从void*
转换为任何其他指针类型。