最近我一直在使用libffi,因为它使用C API,所以任何抽象都是通过使用void指针完成的(好老的C)。我正在创建一个类(使用可变模板),它利用这个API。类声明如下:(其中Ret
=返回值,Args
=函数参数)
template <typename Ret, typename... Args>
class Function
在这个类中,我还声明了两个不同的函数(简化版):
Ret Call(Args... args); // Calls the wrapped function
void CallbackBind(Ret * ret, void * args[]); // The libffi callback function (it's actually static...)
我希望能够从 CallbackBind
中使用 Call
,这是我的问题。我不知道应该如何将 void*
数组转换为模板参数列表。大体上来说,这就是我想要的:
CallbackBind(Ret * ret, void * args[])
{
// I want to somehow expand the array of void pointers and convert each
// one of them to the corresponding template type/argument. The length
// of the 'void*' vector equals sizeof...(Args) (variadic template argument count)
// Cast each of one of the pointers to their original type
*ret = Call(*((typeof(Args[0])*) args[0]), *((typeof(Args[1])*) args[1]), ... /* and so on */);
}
如果无法实现,是否有任何解决方法或其他不同的解决方案可用?
void*
,而且它已经期望这样做。 - Mark BCallbackBind
是从库的API中调用的,所以我正在尝试调用自己的函数,该函数不使用void指针。 @mfontanini 我想要一个类来模仿std::function
,因此我需要可变参数模板(例如operator()(Args...)
)。 - Elliott DarfinkCallAux<Tuple, Indices...>::call(void * args[]) { Call(*static_cast<(*std::tuple_element<Tuple, Indices>*>(args[Indices]))...); }
这样的东西。 - Kerrek SB