存储参数和函数并在另一个函数中使用它们

Storing arguments and function and using them in another function

欢迎,这是一个非常罕见的用例问题。
所以,这就是我想要做的 - 假设我有一个可变参数模板函数,它采用 T ...args 和一个函数类型 FuncT funcName,所以这是我们目前所拥有的:

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

现在,我想将我的功能存储在 void (*)()(此存储功能)。这很好用。

std::deque<void (*)()> functions;
func = functions.front();
func(std::forward<T>(args)...); //args is vardict template argument

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

template<typename FuncT, typename T>

int sharedArgument;

void setArg(int x){
  sharedArgument = x;
}
template<typename FuncT>
void myFunction(FuncT funcName){
  funcName(sharedArgument);
}

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

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

现在,我知道这是不必要的,但我想提出一个我遇到麻烦的更复杂的问题。

当我想存储参数时,我可能会使用 std::tuple,其设计用于存储参数,但是
主要问题是
我如何在元组 中存储 可变数量 的参数,然后 将它们作为 普通参数 完美地转发给某些人函数,所以函数接收

function(std::tupleArgumentsHere...);

将读作

function(5, 42, "yes", 3.14);

我将使用它来存储参数并将它们传递给 std::thread


谢谢,干杯。

使用std::apply. It is new in 。如果不会,自己写。

中,使索引序列与您的元组长度相同。然后func(std::get<Is>(std::forward<Tup>(tup))...).

中做同样的事情,但编写您自己的索引序列。

std::bind 将函数和参数存储在一起。它 returns 一个封装了参数值副本的可调用对象。

您还可以使用它的“占位符”功能,以防在调用 queue.front() 后添加其他参数。