将可变参数模板函数参数传递给另一个函数

时间:2021-01-25 19:53:13

标签: c++

直截了当,有一个类似的问题,但其核心不同。

所以,这就是我想要做的 - 假设我有一个可变参数模板函数,它接受 T ...args 和函数类型 FuncT funcName,所以这是我们目前所拥有的:< /p>

template<typename FuncT, typename ...T>
void myFunction(FuncT (*funcName), T ...args);

现在,我想将我的函数存储在 void (*)()(这个存储函数)。这工作得很好。

现在,我可以将一个函数传递给我的函数,如下所示:

template<typename FuncT, typename T>
void myFunction(FuncT (*funcName), T singleArgument){
  funcName(T singleArgument);
}

void function(int i){
  std::cout << i;
}

int main(){
  myFunction(function, 5);
}

好的,我们成功地传递了一个参数,但是我传递给 myFunction() 的函数接受可变数量的参数。如果我通过 function2(int a, int b) 而不仅仅是 function(int a) 会怎样? 好吧,这就是我的问题

当我使用时:

template<typename FuncT, typename T>
void myFunction(FuncT (*funcName), T singleArgument){
  funcName(/* What should i write here */);
}

void function1(int a){
  std::cout << a;
}

void function2(int a, int b){
  std::cout << a << " " << b;
}

int main(){
  myFunction(function1, 42);
  myFunction(function2, 42, 0);
}

然后我 args,我可以将其传递给接受 variadic template arguments 的函数,但我的函数只接受一些固定数量的 intchar 和其他。< /p>

1 个答案:

答案 0 :(得分:0)

我建议你使用完美转发:

#include <iostream>

template<typename FuncType, typename... Args>
void myFunction(FuncType funcName, Args&&... args){
  funcName(std::forward<Args>(args)...);
}

void function1(int a){
  std::cout << a;
}

void function2(int a, int b){
  std::cout << a << " " << b;
}

int main(){
  myFunction(function1, 42);
  myFunction(function2, 42, 0);
}

https://coliru.stacked-crooked.com/a/a715dc67a30c4ce5