"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > نصائح تنفيذ التقاط الجوال في C ++ Lambda

نصائح تنفيذ التقاط الجوال في C ++ Lambda

نشر في 2025-04-12
تصفح:210

How to Implement Move Capture in C   Lambdas?

على سبيل المثال: std :: Quiention_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 إلى وظيفة أخرى ، اجعل lambda قابلة للتغيير:
std::unique_ptr myPointer(new int);

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

وظيفة مساعد ، make_rref ، يمكن أن تسهل التحرك. تنفيذها كما يلي:

#تضمين #include #include قالب struct rref_impl { rref_impl () = delete ؛ rref_impl (t && x): x {std :: move (x)} {} RREF_IMPL (RREF_IMPL وغيرها) : x {std :: move (other.x)} ، iscopied {true} { تأكيد (other.iscopied == false) ؛ } RREF_IMPL (RREF_IMPL && آخر) : x {std :: move (other.x)} ، iscopied {std :: move (other.iscopied)} { } rref_impl & operator = (rref_impl other) = delete ؛ T & Operator && () { إرجاع std :: move (x) ؛ } خاص: T X ؛ Bool Iscopied = false ؛ } ؛ قالب rref_impl make_rref (t && x) { إرجاع rref_impl {std :: move (x)} ؛ } حالة اختبار لـ make_rref:

int main () { std :: Quiention_ptr p {new int (0)} ؛ auto rref = make_rref (std :: move (p)) ؛ Auto lambda = [RREF] () ageable -> std :: required_ptr {return rref.move () ؛ } ؛ Assert (lambda ()) ؛ تأكيد (! lambda ()) ؛ }

using namespace std;

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

يتم تنفيذ الالتقاط على النحو التالي:

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

يمنع هذا الحل نسخ lambda إذا كان النوع الذي تم التقاطه غير قابل للنسخ ، وتجنب أخطاء وقت التشغيل.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3