存储参数和函数并在另一个函数中使用它们
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 c++17。如果不会,自己写。
在c++14中,使索引序列与您的元组长度相同。然后func(std::get<Is>(std::forward<Tup>(tup))...)
.
在 c++11 中做同样的事情,但编写您自己的索引序列。
std::bind
将函数和参数存储在一起。它 returns 一个封装了参数值副本的可调用对象。
您还可以使用它的“占位符”功能,以防在调用 queue.front()
后添加其他参数。
欢迎,这是一个非常罕见的用例问题。
所以,这就是我想要做的 - 假设我有一个可变参数模板函数,它采用 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 c++17。如果不会,自己写。
在c++14中,使索引序列与您的元组长度相同。然后func(std::get<Is>(std::forward<Tup>(tup))...)
.
在 c++11 中做同样的事情,但编写您自己的索引序列。
std::bind
将函数和参数存储在一起。它 returns 一个封装了参数值副本的可调用对象。
您还可以使用它的“占位符”功能,以防在调用 queue.front()
后添加其他参数。