繁体   English   中英

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

Passing variadic template function arguments to another function

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

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

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和其他。

1 个回复

我建议你使用完美转发:

#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

2 将可变参数模板参数传递给可变参数函数

我们正在使用第三方C库,它提供了printf()样式的日志功能, 由于不值得进入的原因,我们需要限制消息记录的速率,这有点像 幸运的是,C库的作者知道他们在做什么,并提供了 所以写上面的函数是一件相对简单的事情。 不幸的是, 可变功能在内联方面效果不佳 ,所以我想出了第 ...

9 如何允许将可变参数传递给函数

我有一个接受3个参数的函数,但是我也希望它只接受前两个参数,而不关心第三个参数。 我如何在C中做到这一点。我尝试只是在头文件中将函数声明为void list()以为这可能意味着我们不在乎有多少参数,但这是行不通的。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM