我得到了一堆虚拟函数,每个虚拟函数都有自己的返回类型,参数个数(和类型),我试图找出一种自动为它们创建正确类型的函数指针的方法,然后将其存储在地图中以随意检索。简而言之,我被困在创建实际的函数指针。由于它们的变量类型,将它们存储在地图中的方式是一个单独的后续问题。
我认为可以使用模板,并且我尝试创建一个模板化函数,该函数在给定函数的地址和类型的情况下返回适当类型的指针。我认为这是不可能的,所以我们很感谢任何输入。
上述功能的代码:
template <typename retType, typename ... argTypes> retType makeFuncPtr(void* funcAddr) {
retType (*ptr)(argTypes) = funcAddr;
return ptr;
}
我收到错误消息“声明类型包含未扩展的参数包'argTypes'”。我在做错什么,并且由于我不确定,这是该函数的适当返回类型吗?
答案 0 :(得分:0)
您询问的错误是因为在该行中:
retType (*ptr)(argTypes) = funcAddr;
在argTypes之后没有...。请注意,这实际上无法解决问题,因为如果没有强制转换,则无法将void指针转换为其他类型的指针。而且您也无法将函数指针转换为retType。
如果函数具有不同的签名,这是一个相当棘手的问题,建议您看一下libffi,这里棘手的部分是不存储函数指针(只要它们不是非静态成员函数,您就可以简单地强制转换为void *并将其存储),棘手的部分是使用存储的指针值进行调用。
libffi使您能够描述函数的调用约定,返回类型和期望的参数。然后,您可以编写代码以比较实际收到的参数,并根据需要转换或产生错误。使用C ++,甚至可以以编程方式生成该描述(您的模板函数将函数指针作为参数,然后使用参数包映射到libffi参数类型值)。