«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Советы по реализации мобильного захвата в C ++ Lambda

Советы по реализации мобильного захвата в C ++ Lambda

Опубликовано в 2025-04-12
Просматривать:867

How to Implement Move Capture in C   Lambdas?

переместить захват в lambdas

вопрос:

Как мы реализуем захват перемещения, также известные как ссылки на rValue, в C 11 Lambdas? Например:

std::unique_ptr myPointer(new int);

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

, используя пространство имен Std; auto u = make_unique (некоторые, параметры); go.run ([u = move (u)] {do_something_with (u);}); для перемещения объектов из лямбды в другую функцию, сделайте Lambda mintable:

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

вспомогательная функция, make_rref, может облегчить захват перемещения. Его реализация следующим образом:
using namespace std;

auto u = make_unique(some, parameters);  
go.run([u = move(u)] { do_something_with(u); }); 
#включить #include #include Шаблон struct rref_impl { rref_impl () = delete; rref_impl (t && x): x {std :: move (x)} {} rref_impl (rref_impl & fresher) : x {std :: move (ore.x)}, iscopied {true} { ASSERT (другой. } rref_impl (rref_impl && Другое) : x {std :: move (ore.x)}, iscopied {std :: move (ore.iscopied)} { } rref_impl & operator = (rref_impl dise) = delete; T & operator && () { вернуть std :: move (x); } частный: T x; Bool Iscopied = false; }; шаблон rref_impl make_rref (t && x) { return rref_impl {std :: move (x)}; }

тестовый пример для make_rref:
using namespace std;

auto u = make_unique(some, parameters);  
go.run([u = move(u)] { do_something_with(u); }); 
int main () { std :: unique_ptr p {new int (0)}; auto rref = make_rref (std :: move (p)); Auto Lambda = [rref] () mitable -> std :: unique_ptr {return rref.move (); }; assert (лямбда ()); assert (! lambda ()); }

эмулирование обобщенного захвата Lambda в C 11

Другой обходной путь предоставляется функцией Capture ():
using namespace std;

auto u = make_unique(some, parameters);  
go.run([u = move(u)] { do_something_with(u); }); 
#Incult #include int main () { std :: unique_ptr p {new int (0)}; Auto lambda = захват (std :: move (p), [] (std :: ulious_ptr & p) {return std :: move (p); }); assert (лямбда ()); assert (! lambda ()); }

capture реализован следующим образом:
using namespace std;

auto u = make_unique(some, parameters);  
go.run([u = move(u)] { do_something_with(u); }); 
#intict Шаблон класс capture_impl { T x; F f; публика: capture_impl (t && x, f && f) : x {std :: forward (x)}, f {std :: forward (f)} {} Шаблон auto operator () (ts && ... args) -> decktype (f (x, std :: forward (args) ...)) { return f (x, std :: forward (args) ...); } Шаблон auto operator () (ts && ... args) const -> decktype (f (x, std :: forward (args) ...)) { return f (x, std :: forward (args) ...); } }; Шаблон capture_impl capture (t && x, f && f) { return capture_impl ( std :: forward (x), std :: forward (f)); }

это решение предотвращает копирование Lambda, если захваченный тип не является копируемым, избегая ошибок времени выполнения.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3