Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux 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() و مررناها للدالة Lambda Expressions و لكننا الآن سنقوم بإعادة نفس الكود السابقة و تعريف نفس الدالة السابقة بأسلوب Lambda Expressions مع تمريرها بشكل مباشر للدالة remove_if() كالتالي.

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_list هنا قمنا بتعريف كائن من الكلاس
    forward_list<int> myList = {1, 3, 2, 4, 2, 5, 1, 5};

    // remove_if() لحذف جميع العناصر التي تستوفي الشرط الذي مررناه بين أقواس الدالة myList من الكائن 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 = ";

    // إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه myList هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن
    for (auto it = myList.begin(); it != myList.end(); ++it)
    {
        cout << *it << " ";
    }

    return 0;
}

النتيجة

values = 1 3 2 2 1