c – 如何通过前进或移动捕获参数包?
发布时间:2020-12-16 03:37:11 所属栏目:百科 来源:网络整理
导读:说我有这个功能: template typename ...Avoid test(A ...a){ [=]() { };} 参数包将被转发到lambda还是被值复制?我很担心,因为我必须通过一个明确的move()或forward(),因为…是左值.一个元组中介需要转发/移动它们吗?如果是这样,是否存在一种简单的方法来
说我有这个功能:
template <typename ...A> void test(A&& ...a) { [=]() { }; } 参数包将被转发到lambda还是被值复制?我很担心,因为我必须通过一个明确的move()或forward(),因为…是左值.一个元组中介需要转发/移动它们吗?如果是这样,是否存在一种简单的方法来将元组解包成参数包,而不使用索引技巧? 解决方法
使用
std::bind 可以完成的其余一些有用的功能之一.捕获由bind执行,捕获的值作为参数传递给无捕获的通用lambda:
template <typename... A> auto test(A&&... a) { auto f = [](auto&&... a) { // use a... }; return std::bind(f,std::forward<A>(a)...); } Live demo 以上与Clang合作,但这个GCC似乎有一个虚假的挥发性限定词的问题. 我们可以在没有绑定的情况下通过在第二个lambda中捕获一个元组来实现,该第二个lambda调用 template <typename... A> auto test(A&&... a) { auto f = [](auto&&... a) { // use a... }; return [f,tup = std::make_tuple(std::forward<A>(a)...)]() mutable { std::apply(f,tup); }; } Live demo 与Clang和GCC合作;应用是使用您想避免的索引技巧实现的,但您不会暴露于它. mutable意味着第二个lambda的调用运算符是非const,因此元组元素最终不会获得const限定条件. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c# – 使用动态文件名读取存储在资源文件(resx)中的字符串
- Oracle 10g PL/SQL中的“CONTINUE”关键字
- ios – 上传到Itunes Connect时“代码签名”GoogleToolboxF
- 替换为C 17中删除的bind1st
- iphone – 如何让UIWebView从自己的应用程序中显示pdf文件?
- XML fragments parsed from previous mappers already cont
- VBA粘贴Excel选定工作表范围到活动的PowerPoint幻灯片中
- c# – 如何获取SharePoint中所有用户的列表
- 巧用AJAX技术,通过updatePanel控件实现局部刷新
- C#中的相当重要的名字(表格)