Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建指向具有可变参数的函数的可调用函数指针?_C++_Function Pointers_Variadic Templates - Fatal编程技术网

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");