我可以将函数指针void *转换为std :: function吗?

时间:2018-01-30 03:51:25

标签: c++ c++11 c++14

函数指针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?

2 个答案:

答案 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_caststatic_cast显式允许您从void*转换为任何其他指针类型。