C++ 如何创建指向具有可变参数的函数的可调用函数指针?
我有以下功能C++ 如何创建指向具有可变参数的函数的可调用函数指针?,c++,function-pointers,variadic-templates,C++,Function Pointers,Variadic Templates,我有以下功能 template <typename... Args> void func(Args&&... args){ // do stuff } 但是,这会阻止我使用真正的变量列表调用指针。我想要一个指针,它允许我像真正的变量函数一样调用它,如下所示: var_func_p("Test"); var_func_p(0.3, 5); var_func_p('c', "Another test", 1.3, 3); 我
template <typename... Args>
void func(Args&&... args){
// do stuff
}
但是,这会阻止我使用真正的变量列表调用指针。我想要一个指针,它允许我像真正的变量函数一样调用它,如下所示:
var_func_p("Test");
var_func_p(0.3, 5);
var_func_p('c', "Another test", 1.3, 3);
我不知道如何做到这一点。有人能帮我吗?像这样:
template <typename... Args>
void func(Args&&... args){
// do stuff
}
template <typename... Args>
using f_ptr = void(*)(Args&&...);
int main() {
f_ptr<int,int> p = &func<int,int>;
p(3,1);
}
模板
无效函数(参数&&…参数){
//做事
}
模板
使用f_ptr=void(*)(参数和…);
int main(){
f_ptr p=&func;
p(3,1);
}
但是,指向func
的不同实例的指针不兼容
然而,这使我无法使用真正的可变参数列表调用指针。我想要一个指针,它允许我像真正的变量函数一样调用它,如下所示:
var_func_p("Test");
var_func_p(0.3, 5);
var_func_p('c', "Another test", 1.3, 3);
不能将指向eg
func
的指针存储在f_ptr
func
实际上不是函数。它是一个模板,编译器可以在需要时使用它来创建新函数
执行func(5)
时,编译器会创建一个名为func
的函数,然后调用它。执行func(5.0,'a')
时,编译器会创建一个名为func
的函数,然后调用它。这是两个完全不同、不相关的函数,具有两种不同的类型
您可以按常规方式创建指向
func
或func
或func
或func
的指针。但是您永远无法创建指向func
的指针,因为func
不是函数,而是编译器的指令。简单地说,这是不可能的
函数模板不是函数,它是函数的模板——因此,在指定所需的实例化之前,它没有函数指针。此时,指针固定到特定类型的特定数量的参数
<> >在C++语言中,将擦除模板类型化为一个单一类型,例如指针,可以绕过并懒惰地实例化。
也就是说,代码如下所示:
some_discrete_variadic_type x = var_func_1;
x(1);
x(1, "2");
x = var_func_2;
x(1);
x(1, "2");
不可能,因为要使类型擦除工作,必须将擦除规范化为固定数量的类型(在本例中,它将是实例化)
然而,根据您试图解决的问题,可能会有变通办法——尽管这需要更多信息 如果您的使用更为有限——例如将功能传递到只有在编译时才知道的其他函数中,那么您可以使用Functor对象,并将它们传递到函数模板中,在模板中推导参数。例如:
struct var\u func
{
模板
自动运算符()(Args&&…Args)->void
{
//做点什么
}
};
其中被调用的示例可以是:
模板
自动消费(T var\u func\p)->void
{
var_func_p(“测试”);
var_func_p(0.3,5);
var_func_p('c',“另一个测试”,1.3,3);
}
int main()
{
消费(var_func{});
消费(一些其他变量函数{});
}
请注意,在本例中,您不再传递函数模板。您正在传递一个静态对象,
var\u func
,它包含一个调用运算符(operator()
),该运算符是函数模板。您需要它做什么?函数指针指向一种特定类型的函数。该模板的不同实例化具有不同的类型?您的命名有点混乱,func
用于函数和指针。你为什么认为你需要指针?你不能直接调用这个函数吗?通常当我发现自己处于这种情况时,我会遇到一个设计错误。但当我不知道的时候,试着用一个简单的句子来抽象出可变性。谢谢你的回答。我要试试这个。消耗和运算符重载之后“->void”的含义是什么?这只是c++11中引入的一种不同的编写方法<代码>自动消费(T var\u func\u p)->void与写入无效消费(T var\u func\u p)
相同。对不起,我弄糊涂了;这就是我通常如何写C++的这些天。
some_discrete_variadic_type x = var_func_1;
x(1);
x(1, "2");
x = var_func_2;
x(1);
x(1, "2");