"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Dicas de implementação de captura móvel em C ++ lambda

Dicas de implementação de captura móvel em C ++ lambda

Postado em 2025-04-12
Navegar:366

How to Implement Move Capture in C   Lambdas?

move captura em lambdas

Pergunta:

Como implementamos a captura de movimentos, também conhecidos como referências rvalue, em C 11 LDAS? Por exemplo:

std::unique_ptr myPointer(new int);

std::function example = [std::move(myPointer)] {
   *myPointer = 4;
};

Responder:

lambda generalizada captura em c 14

em C 14, captura generalizada de lambda permite a captura de movimentação. Este código agora é válido:

using namespace std;

auto u = make_unique(some, parameters);  
go.run([u = move(u)] { do_something_with(u); }); 

para mover objetos de um lambda para outra função, faça o lambda mutável:

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

uma função auxiliar, make_rref, pode facilitar o movimento da captura. Sua implementação é a seguinte:

#incluir #include #include Modelo struct rref_impl { rref_impl () = excluir; rref_impl (t && x): x {std :: move (x)} {} rref_impl (rref_impl & outros) : x {std :: move (outros.x)}, iscopado {true} { assert (outros.iscopied == false); } rref_impl (rref_impl && outro) : x {std :: move (outros.x)}, iscopado {std :: move (outros.iscopied)} { } rref_impl & operator = (rref_impl outros) = exclate; T & Operator && () { retornar std :: mover (x); } privado: T x; bool iscopied = false; }; modelo rref_impl make_rref (t && x) { retornar rref_impl {std :: mover (x)}; }

um caso de teste para make_rref:
#include 
#include 
#include 

template 
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 rref_impl make_rref(T&& x) {
    return rref_impl{std::move(x)};
}
int main () { std :: Único_ptr p {new int (0)}; rref automático = make_rref (std :: mover (p)); Lambda automático = [rref] () mutável -> std :: Único_ptr {return rref.move (); }; assert (lambda ()); assert (! lambda ()); }

int main() {
    std::unique_ptr p{new int(0)};
    auto rref = make_rref(std::move(p));
    auto lambda =
        [rref]() mutable -> std::unique_ptr { return rref.move(); };
    assert(lambda());
    assert(!lambda());
}

Outra solução alternativa é fornecida pela função Capture ():

#incluir #include int main () { std :: Único_ptr p {new int (0)}; Auto lambda = Capture (std :: move (p), [] (std :: Único_ptr & p) {return std :: move (p); }); assert (lambda ()); assert (! lambda ()); }

A captura é implementada da seguinte Modelo classe Capture_Impl { T x; F f; público: capture_impl (t && x, f && f) : x {std :: forward (x)}, f {std :: forward (f)} {} Modelo Operador automático () (TS && ... args) -> Decttype (f (x, std :: forward (args) ...)) { retornar f (x, std :: forward (args) ...); } Modelo Operador automático () (TS && ... args) const -> Decttype (f (x, std :: forward (args) ...)) { retornar f (x, std :: forward (args) ...); } }; Modelo capture_impl captura (t && x, f && f) { retornar capture_impl ( std :: forward (x), std :: forward (f)); Am
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3