首页 > 后端开发 > C++ > 如何在 C 11 Lambda 中实现移动捕获?

如何在 C 11 Lambda 中实现移动捕获?

Barbara Streisand
发布: 2024-12-09 20:22:11
原创
846 人浏览过

How Can I Achieve Move Capture in C  11 Lambdas?

在 C 11 Lambda 中通过移动捕获

C 14 中的移动捕获

C 14 引入了广义 lambda 捕获,它允许移动捕获。此功能支持以下代码:

using namespace std;

auto u = make_unique<some_type>(some, parameters);  

go.run([u = move(u)] { do_something_with(u); }); 
登录后复制

C 11 中移动捕获的解决方法

在 C 11 中,可以使用辅助函数 make_rref 来模拟移动捕获:

#include <cassert>
#include <memory>
#include <utility>

template <typename T>
struct rref_impl
{
    // ... (implementation omitted for brevity)
};

template<typename T> rref_impl<T> make_rref( T && x )
{
    return rref_impl<T>{ std::move(x) };
}
登录后复制

使用示例:

std::unique_ptr<int> p{new int(0)};
auto rref = make_rref(std::move(p));
auto lambda = [rref]() mutable -> std::unique_ptr<int> { return rref.move(); };
assert(lambda());
assert(!lambda());
登录后复制

模拟通用 Lambda 捕获在 C 11 中

广义 lambda 捕获也可以使用捕获函数来模拟:

#include <utility>

template <typename T, typename F>
class capture_impl
{
    // ... (implementation omitted for brevity)
};

template <typename T, typename F>
capture_impl<T,F> capture( T && x, F && f )
{
    // ... (implementation omitted for brevity)
}
登录后复制

示例用法:

std::unique_ptr<int> p{new int(0)};
auto lambda = capture(std::move(p), [](std::unique_ptr<int> &p) { return std::move(p); });
assert(lambda());
assert(!lambda());
登录后复制

以上是如何在 C 11 Lambda 中实现移动捕获?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板