在我的项目中,我想用这个签名绑定一个函数:
template <typename... Args> void* functionA(int a, int b, Args&& ... args){
...
}
指针......所以这是我尝试的方式:
...
void** new_address_ptr;
*new_address_ptr = (void*) &functionA;
...
然而,这会产生这样的错误:重载函数的地址,没有上下文类型信息
我需要void** new_address_ptr;
才能进一步执行,但我无法弄清楚如何绑定它......
答案 0 :(得分:2)
functionA
不是函数的名称,而是模板的名称。要将其转换为函数的名称(将是模板的实例化),请添加适当的模板参数。例如,如果您想使用functionA
和int
来呼叫std::string &
,请执行以下操作:
*new_address_ptr = reinterpret_cast<void*>(&functionA<int, std::string&>);
然而,这有些问题。您需要预先提供模板参数(正确类型),并且由于该函数使用转发引用,因此查找正确的类型可能并不容易:您需要使用左值引用来启用使用左值调用函数
更不用说存储指向void *
中的函数的指针甚至不能保证工作,这取决于你的编译器是否支持它。
我使用reinterpret_cast
因为在C ++中最好避免使用C风格的强制转换,因为它需要详细检查所涉及的类型以实现它们的确切功能。
答案 1 :(得分:1)
你不能这样做,因为没有functionA
这样的功能存在。
您必须实例化模板,然后才能获取该函数的地址。