Programming Basics SQL HTML CSS JavaScript Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Learn Typing

C++طريقة تمرير دالة معرّفة بأسلوب Lambda Expressions لدالة أخرى

تعريف الدوال بأسلوب Lambda Expressions عادةً ما يستخدم عند استخدام دالة تحتوي على باراميتر عبارة عن دالة أخرى.
في درس الحاويات الديناميكية ( STL ) و بالتحديد حين شرحنا كيفية التعامل مع الكلاس forward_list قمنا باستخدام دالة إسمها remove_if() و قلنا أن هذه الدالة يجب أن نمرر لها دالة أخرى عند استدعائها حتى نحدد كيف سيتم حذف العناصر من الكائن.

يجب أن تراجع شرح الكلاس forward_list جيداً مع قراءة جميع الأمثلة الموضوعة فيه حتى تفهم ما سيتم شرحه الآن.


في ذاك الدرس و بالتحديد في المثال الخامس, قمنا بتعريف الدالة shouldBeRemoved() و من ثم تمريرها للدالة remove_if() كالتالي.

// shouldBeRemoved() هكذا قمنا بتعريف الدالة
bool shouldBeRemoved(const int& value)
{
if (value > 3)
{
return true;
}
return false;
}
..
..
// remove_if() و هكذا قمنا بتمريرها للدالة
myList.remove_if(shouldBeRemoved);
// shouldBeRemoved() هكذا قمنا بتعريف الدالة bool shouldBeRemoved(const int& value) { if (value > 3) { return true; } return false; } .. .. // remove_if() و هكذا قمنا بتمريرها للدالة myList.remove_if(shouldBeRemoved);

إذاً ما فعلناه وقتها هو أننا قمنا بتعريف دالة عادية إسمها shouldBeRemoved() و مررناها للدالة Lambda Expressions و لكننا الآن سنقوم بإعادة نفس الكود السابقة و تعريف نفس الدالة السابقة بأسلوب Lambda Expressions مع تمريرها بشكل مباشر للدالة remove_if() كالتالي.

myList.remove_if( [](const int& value) {
if (value > 3)
{
return true;
}
return false;
});
myList.remove_if( [](const int& value) { if (value > 3) { return true; } return false; });

الآن إذا كنا سنعيد نفس المثال الخامس مع التركيز فقط على تمرير Lambda Expressions للدالة remove_if() فسيكون الكود كالتالي.

مثال

Main.cpp
#include <iostream>
#include <forward_list>
using namespace std;
int main()
{
// بالإضافة إلى أننا قمنا بإضافة عدة قيم فيه int يمكنه أن يحتوي على عناصر نوعها forward_هنا قمنا بتعريف كائن من الكلاس
forward_list<int> my= {1, 3, 2, 4, 2, 5, 1, 5};
// remove_if() لحذف جميع العناصر التي تستوفي الشرط الذي مررناه بين أقواس الدالة myمن الكائن remove_if() هنا قمنا باستدعاء الدالة
// Lambda Expression لاحظ أننا قمنا بتمرير نفس الدالة التي قمنا بتمريرها في المثال في السابق و لكن بأسلوب remove_if() بين أقواس الدالة
myList.remove_if( [](const int& value) {
// لإعلام المترجم أنه يجب حذف العنصر من الكائن الذي قام باستدعائها true هنا قلنا أن أي عنصر تكون قيمته أكبر من 3 سترجع الدالة
if (value > 3)
{
return true;
}
// لإعلام المترجم أنه يجب عدم حذف العنصر من الكائن الذي قام باستدعائها false في حال لم تكن قيمة العنصر أكبر من 3 سيتم إرجاع القيمة
return false;
});
cout << "values = ";
// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه myهنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن
for (auto it = myList.begin(); it != myList.end(); ++it)
{
cout << *it << " ";
}
return 0;
}
#include <iostream> #include <forward_list> using namespace std; int main() { // بالإضافة إلى أننا قمنا بإضافة عدة قيم فيه int يمكنه أن يحتوي على عناصر نوعها forward_هنا قمنا بتعريف كائن من الكلاس forward_list<int> my= {1, 3, 2, 4, 2, 5, 1, 5}; // remove_if() لحذف جميع العناصر التي تستوفي الشرط الذي مررناه بين أقواس الدالة myمن الكائن remove_if() هنا قمنا باستدعاء الدالة // Lambda Expression لاحظ أننا قمنا بتمرير نفس الدالة التي قمنا بتمريرها في المثال في السابق و لكن بأسلوب remove_if() بين أقواس الدالة myList.remove_if( [](const int& value) { // لإعلام المترجم أنه يجب حذف العنصر من الكائن الذي قام باستدعائها true هنا قلنا أن أي عنصر تكون قيمته أكبر من 3 سترجع الدالة if (value > 3) { return true; } // لإعلام المترجم أنه يجب عدم حذف العنصر من الكائن الذي قام باستدعائها false في حال لم تكن قيمة العنصر أكبر من 3 سيتم إرجاع القيمة return false; }); cout << "values = "; // إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه myهنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن for (auto it = myList.begin(); it != myList.end(); ++it) { cout << *it << " "; } return 0; }

سنحصل على النتيجة التالية عند التشغيل.

values = 1 3 2 2 1