有什么方法可以表达函数参数?

时间:2016-01-11 17:50:38

标签: c++ templates

我们说我有一个功能

void fun1(int i, char j, char* c, long l) {...}

。有没有什么方法可以从 fun1 表达参数列表而不自己写出来?

void fun2(char additionalVar, std::getAllThoseParameters(fun1))

对于上下文,我的最终目标是写下这样的东西:

void fun1(int i, char j, char* c, long l) {...}

template<typename Fn, Fn fn> 
 void fun2(char additionalVar, std::getAllThoseParameters){
  ...
  fn(std::getAllThoseParameters);
}
int main(){
   fun2('a',1,'c',NULL,5l);
   return 0;
}

2 个答案:

答案 0 :(得分:2)

您可以使用可变参数函数模板和参数包。

void fun1(int i, char j, char* c, long l) {}

template<typename Fn, typename ... Args> 
 void fun2(Fn fn, char additionalVar, Args ... args){
  fn(args ...);
}

void fun3(int i, char j) {}

int main(){
   fun2(fun1, 'a',1,'c',nullptr,5l);
   fun2(fun3, 'a',1,'c');
   fun2( [](int i, char j, double k) -> void {}, 'a',1,'c', 1.0);
   return 0;
}

答案 1 :(得分:2)

不完全是你问的问题,但可以解决你的问题:

void fun1(int i, char j, char* c, long l) {...}

template<typename Ret, typename ... Args> 
void fun2(Ret (*fn) (Args...), char additionalVar, Args... args){
    fn(args...);
}

int main(){
   fun2(&fun1, 'a', 1, 'c', NULL, 5l);
}

或只是

template<typename Fn, Fn fn, typename ... Ts> 
void fun2(char additionalVar, Ts&&... args){
    fn(std::forward<Ts>(args)...);
}

int main(){
   fun2<decltype(&func1), &func1>('a', 1, 'c', NULL, 5l);
}