Rumah >pembangunan bahagian belakang >C++ >Bagaimana Saya Boleh Mencapai Move Capture dalam C 11 Lambdas?

Bagaimana Saya Boleh Mencapai Move Capture dalam C 11 Lambdas?

Barbara Streisand
Barbara Streisandasal
2024-12-09 20:22:11849semak imbas

How Can I Achieve Move Capture in C  11 Lambdas?

Menangkap dengan Bergerak dalam Lambda C 11

Mengalih Tangkap dalam C 14

C 14 memperkenalkan tangkapan lambda umum, yang membenarkan tangkapan bergerak. Ciri ini membolehkan kod seperti:

using namespace std;

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

go.run([u = move(u)] { do_something_with(u); }); 

Penyelesaian untuk Move Capture dalam C 11

Dalam C 11, move capture boleh dicontohi menggunakan fungsi helper 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) };
}

Contoh penggunaan:

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());

Meniru Lambda Umum Tangkap dalam C 11

Tangkapan lambda umum juga boleh dicontohi menggunakan fungsi tangkapan:

#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)
}

Contoh penggunaan:

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());

Atas ialah kandungan terperinci Bagaimana Saya Boleh Mencapai Move Capture dalam C 11 Lambdas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn