C++ C++;将函数绑定到指针

C++ C++;将函数绑定到指针,c++,variadic-functions,C++,Variadic Functions,在我的项目中,我想用以下签名绑定一个函数: template <typename... Args> void* functionA(int a, int b, Args&& ... args){ ... } 但是,这会产生以下错误:没有上下文类型信息的重载函数的地址 我需要void**new\u address\u ptr用于我的进一步执行,但我就是不知道如何绑定它…您不能这样做,因为不存在像function这样的函数。 您必须实例化模板,然后才能获得该函数

在我的项目中,我想用以下签名绑定一个函数:

template <typename... Args> void* functionA(int a, int b, Args&& ... args){
    ...
}
但是,这会产生以下错误:没有上下文类型信息的重载函数的地址


我需要
void**new\u address\u ptr用于我的进一步执行,但我就是不知道如何绑定它…

您不能这样做,因为不存在像
function
这样的函数。
您必须实例化模板,然后才能获得该函数的地址。

function
不是函数的名称,而是模板的名称。要将其转换为函数名(这将是模板的实例化),请添加适当的模板参数。例如,如果要使用
int
std::string&
调用
function
,请执行以下操作:

*new_address_ptr = reinterpret_cast<void*>(&functionA<int, std::string&>);
*新地址\u ptr=重新解释类型(&F);
然而,这似乎有问题。您需要预先提供模板参数(正确的类型),并且由于函数使用转发引用,因此查找正确的类型可能并不容易:您需要使用左值引用来启用使用左值调用函数

更不用说在
void*
中存储指向函数的指针甚至不能保证工作,这取决于编译器是否支持它



我使用了<代码> RealTytPase,因为C++风格最好避免在C++中使用,因为它需要对所涉及的类型进行详细检查,以了解它们到底在做什么。< / P>我可以重新解释瓦拉格斯的角色吗?@AksimElnik你能澄清一下吗?结果函数没有可变参数。对于参数的每一个arity(和类型组合),您都会得到一个不同的函数。@AksimElnik afaik varargs是一个compiletime概念,在运行时,任何函数都会接受固定数量的参数。另一方面,函数指针只能在运行时使用。“我的印象是,你把不起作用的东西混在一起了。@AksimElnik不确定我是否理解最后的评论。”。您可以通过传递固定数量的模板参数来实例化可变模板,例如,在

function
@AksimElnik中,像您这样的模板(具有可变数量的模板参数)会为每个模板参数列表(通常从函数参数推断)生成不同的实例化。所以不,这些导致了不同的功能。也有C风格的变量(如<代码> Prtff使用),但最好避免在C++中使用。总而言之,这个问题似乎有点像是一个问题。
*new\u address\u ptr=function只有当我实例化了我的模板时才有效,对吗???如果
function
是一个常规函数,而不是一个模板,那么如何实例化它呢?您确实需要一个cast来分配给
void*
。函数指针不会自动转换为对象指针(反之亦然)。@Angew我也这么认为,但当我尝试使用ms编译器时,它不会出现任何警告,但会出错。@Pavel您不能信任ms编译器与标准遵从性相关的任何事。为什么首先需要
void**
?有更好的方法来存储函数指针JNI允许我重新绑定java静态方法,只是为了使**指针无效。。。遗憾的是,我无法改变这一点
*new_address_ptr = reinterpret_cast<void*>(&functionA<int, std::string&>);