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
788 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!

sumber:php.cn
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