البرمجة

استخدام التقاط بالقيمة في لامبدا في C++

في هذا الكود، الجزء الذي يبدو غريبًا هو جزء التقاط (capture) في اللامبدا (lambda)، حيث يتم استخدام الجملة f=decltype(f)(f) للتقاط (capture) المتغير f بقيمته الحالية.

في C++، التقاط المتغيرات في لامبدا يمكن أن يتم بثلاث طرق رئيسية:

  1. التقاط بالقيمة (By Value): [](int x) { ... } حيث يتم نسخ قيمة x داخل اللامبدا.
  2. التقاط بالمرجع (By Reference): [&x](int y) { ... } حيث يتم تقاط x بالمرجع.
  3. التقاط بالقيمة والتحكم في الحياة (Capture by Value with Lifetime Extension): [x=std::move(x)](int y) { ... } حيث يتم التقاط x بالقيمة ولكن يتم تأمين حياة x عبر الحياة الداخلية للامبدا.

في الكود الذي قدمته، يتم استخدام التقاط بالقيمة والتحكم في الحياة (Capture by Value with Lifetime Extension). الجزء f=decltype(f)(f) يعني أنه يتم إنشاء نسخة جديدة من المتغير f باستخدام قيمته الحالية وتخزينها داخل اللامبدا. هذا يسمح بالتحكم في عمر حياة f داخل اللامبدا بحيث تكون متوفرة طوال فترة وجود اللامبدا، حتى إذا تم تغيير قيمة f خارج اللامبدا، فإن النسخة المخزنة داخل اللامبدا لن تتأثر بهذا التغيير.

المزيد من المعلومات

في C++، عند استخدام التقاط بالقيمة والتحكم في الحياة، يكون الهدف هو تأمين حياة المتغير الملتقط داخل اللامبدا لتكون متاحة طوال فترة وجود اللامبدا. هذا يعني أن اللامبدا يحتفظ بنسخة من المتغير، وليس بالمتغير نفسه. إذا تغيرت قيمة المتغير الأصلي خارج اللامبدا، فإن القيمة الملتقطة داخل اللامبدا لن تتأثر بهذا التغيير.

مثال على ذلك، افترض أن لدينا متغير x يحتوي على القيمة 5، ونقوم بإنشاء لامبدا ونقوم بالتقاط x بالقيمة والتحكم في الحياة كالتالي:

cpp
int x = 5; auto lambda = [x = std::move(x)]() { std::cout << "Captured value: " << x << std::endl; }; x = 10; // تغيير قيمة x بعد التقاطه lambda(); // سيتم طباعة القيمة الملتقطة والتي هي 5

في هذا المثال، عندما تم التقاط x داخل اللامبدا، تم إنشاء نسخة جديدة من x تحتفظ بقيمته الأصلية 5. عند تغيير قيمة x بعد التقاطه، لم يتأثر القيمة الملتقطة داخل اللامبدا، وبالتالي عند استدعاء اللامبدا ستطبع القيمة 5 وليس القيمة الجديدة 10.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر