【问题标题】:Storing arguments and function and using them in another function存储参数和函数并在另一个函数中使用它们
【发布时间】:2021-02-01 16:51:41
【问题描述】:

欢迎,这是一个非常罕见的用例问题。
所以,这就是我想要做的——假设我有一个可变参数模板函数,它接受 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::bind?

标签: c++ variadic-templates stdtuple


【解决方案1】:

使用std::apply。它是 中的新功能。如果不能,请自己编写。

中,创建一个与元组长度相同的索引序列。然后func(std::get&lt;Is&gt;(std::forward&lt;Tup&gt;(tup))...)

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

【讨论】:

  • 元组是变长的,这就是问题
  • @arma apply 适用于可变长度元组。只要您知道函数类型和元组类型,只需使用实际正确键入的值调用 apply。
  • 谢谢,很高兴知道是否有 c++11 方式可以像 apply 一样工作,但仍然标记为 answear,谢谢!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-10-20
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多