通过捕获作为另一个lambda的参数将lambda传递
pass lambda with capture as a parameter of ANOTHER lambda, possible?
是否可以将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);
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 使用自动推导的 lambda 参数作为常量表达式
- 如何参数化用作另一个 lambda 参数的 lambda
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- 从成员函数签名中自动推导lambda参数
- Clang声称通用lambda参数的constexpr成员不是constexpr
- 如果我的模板类型首先以lambda参数而发生,则MSVC会引起一个奇怪的错误
- 继承类中没有匹配的泛型委托作为 lambda 参数
- 为什么在lambda参数中不允许自动
- 如何定义通用 lambda 参数的模板参数?
- 在 QGraphicsScene 中拖动 QPixmap:如何避免 lambda 参数中不允许'auto'
- variadic模板函数会以相反的顺序调用lambda参数
- 可变模板lambda参数的模板推导
- 嵌套模板功能中的C 0x lambda参数
- 带有 std::函数和 lambda 参数的分段错误
- 从值捕获的变量分配到lambda参数时,GCC编译器分割故障
- 标准::p空气的通用 lambda 参数
- C++ lambda 参数列表
- 我的 lambda 参数真的在阴影我的当地人吗?
- 从常量和引用的角度来看,函数应该如何接受*lambda*参数