通过捕获作为另一个lambda的参数将lambda传递

pass lambda with capture as a parameter of ANOTHER lambda, possible?

本文关键字:lambda 参数 传递 另一个      更新时间:2023-10-16

是否可以将lambda函数通过capture 作为另一个lambda函数的参数?

int a=3;
auto func_1=[&]()->{a=4;};
auto func_2=[&](  ?????  fParam   ){  fParam(); }; //what is a proper ?????
func_2(func_1);

(我想用它做一些花哨的事情。)

编辑

感谢许多解决方案。我学到了很多。

在原始问题中,我忘了提到 func_2 也想接收其他功能,例如 func_2(func_1a) func_2(func_1b)等。

因此, exltype 是原始问题的正确答案之一,但不能满足我的需求。

这就是auto的目的:

auto func_2=[&](auto fParam   ){  fParam(); }; 

您的编译器必须至少具有C 14级语言支持。

编辑:使用C 11,下面似乎有效:

auto func_2=[&](decltype(func_1)  fParam   ){  fParam(); }; 

正如克里斯在评论中所说的那样,您可以使用std::function。考虑到您对auto固有缺乏类型检查的担忧,这具有使您可以限制在特定签名的可销售物中的优势,因为std::function是一个模板,该模板是一个模板,用于程序中的每个签名一次,并且模板实例化AREN AREN'T敞篷。它可以毫不费力地容纳一个lambda,就像其他任何可召唤的对象一样。

这种类型检查级别可能比decltype(oneSpecificLambda)版本更有用,但这很有用!

将其与其他答案结合在一起,因此您可以选择在声明点限制传递的参数,至少以3种方式:

  • 根本不= auto
  • 到特定函数签名= std::function< T_Return(T_Args...) >
  • 或特定的单个函数对象= decltype(oneSpecificLambda),因为每个lambda都是独特的未命名类型,而不是可转换。

就个人而言,在这种情况下,我可能只会使用auto,并且相信自己不要意外地通过其他任何内容。但是最好有很多选择!

我很确定这也可以工作,但是正如Sam Varshavchik所说,如果C 14可用,请使用自动。

int a=3;
auto func_1=[&]()->{a=4;};
auto func_2=[&](  decltype(func_1) fParam ){  fParam(); };
func_2(func_1);