Heim >Backend-Entwicklung >C++ >Wie kann ich Move Capture in C 11 Lambdas erreichen?

Wie kann ich Move Capture in C 11 Lambdas erreichen?

Barbara Streisand
Barbara StreisandOriginal
2024-12-09 20:22:11849Durchsuche

How Can I Achieve Move Capture in C  11 Lambdas?

Erfassung durch Bewegung in einem C 11-Lambda

Bewegungserfassung in C 14

C 14 führt eine verallgemeinerte Lambda-Erfassung ein, die eine Bewegungserfassung ermöglicht. Diese Funktion ermöglicht Code wie:

using namespace std;

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

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

Workaround für Move Capture in C 11

In C 11 kann Move Capture mithilfe einer Hilfsfunktion 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) };
}
Beispielverwendung:

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());
Emulierung der generalisierten Lambda-Erfassung in C 11

Generalisierte Lambda-Erfassung kann auch mithilfe einer Erfassungsfunktion emuliert werden:

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

Das obige ist der detaillierte Inhalt vonWie kann ich Move Capture in C 11 Lambdas erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn