Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Melaksanakan Move Capture dalam C Lambdas?

Bagaimana untuk Melaksanakan Move Capture dalam C Lambdas?

Linda Hamilton
Lepaskan: 2024-12-26 13:35:10
asal
817 orang telah melayarinya

How to Implement Move Capture in C   Lambdas?

Move Capture dalam Lambdas

Soalan:

Bagaimana kita melaksanakan move capture, juga dikenali sebagai rujukan nilai, dalam C 11 lambdas? Contohnya:

std::unique_ptr<int> myPointer(new int);

std::function<void(void)> example = [std::move(myPointer)] {
   *myPointer = 4;
};
Salin selepas log masuk

Jawapan:

Tangkapan Lambda Umum dalam C 14

Dalam C 14, lambda umum tangkapan membolehkan tangkapan bergerak. Kod ini kini sah:

using namespace std;

auto u = make_unique<some_type>(some, parameters);  
go.run([u = move(u)] { do_something_with(u); }); 
Salin selepas log masuk

Untuk mengalihkan objek dari lambda ke fungsi lain, jadikan lambda boleh berubah:

go.run([u = move(u)] mutable { do_something_with(std::move(u)); });
Salin selepas log masuk

Penyelesaian untuk Move Capture dalam C 11

Fungsi pembantu, make_rref, boleh memudahkan penangkapan bergerak. Pelaksanaannya adalah seperti berikut:

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

template <typename T>
struct rref_impl {
    rref_impl() = delete;
    rref_impl(T&& x) : x{std::move(x)} {}
    rref_impl(rref_impl& other)
        : x{std::move(other.x)}, isCopied{true}
    {
        assert(other.isCopied == false);
    }
    rref_impl(rref_impl&& other)
        : x{std::move(other.x)}, isCopied{std::move(other.isCopied)}
    {
    }
    rref_impl& operator=(rref_impl other) = delete;
    T& operator&&() {
        return std::move(x);
    }

private:
    T x;
    bool isCopied = false;
};

template<typename T> rref_impl<T> make_rref(T&& x) {
    return rref_impl<T>{std::move(x)};
}
Salin selepas log masuk

Satu kes ujian untuk make_rref:

int main() {
    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());
}
Salin selepas log masuk

Meniru Generalized Lambda Capture dalam C 11

Satu lagi penyelesaian disediakan oleh fungsi capture():

#include <cassert>
#include <memory>

int main() {
    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());
}
Salin selepas log masuk

capture dilaksanakan seperti berikut:

#include <utility>

template <typename T, typename F>
class capture_impl {
    T x;
    F f;
public:
    capture_impl(T&& x, F&& f)
        : x{std::forward<T>(x)}, f{std::forward<F>(f)} {}

    template <typename ...Ts> auto operator()(Ts&& ...args)
        -> decltype(f(x, std::forward<Ts>(args)...)) {
        return f(x, std::forward<Ts>(args)...);
    }

    template <typename ...Ts> auto operator()(Ts&& ...args) const
        -> decltype(f(x, std::forward<Ts>(args)...)) {
        return f(x, std::forward<Ts>(args)...);
    }
};

template <typename T, typename F>
capture_impl<T, F> capture(T&& x, F&& f) {
    return capture_impl<T, F>(
        std::forward<T>(x), std::forward<F>(f));
}
Salin selepas log masuk

Penyelesaian ini menghalang penyalinan lambda jika jenis yang ditangkap tidak boleh disalin, mengelakkan ralat masa jalan.

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

Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan