"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية تنفيذ عمليات اتصال C ++ العامة باستخدام أعضاء الفصل و `std :: function`؟

كيفية تنفيذ عمليات اتصال C ++ العامة باستخدام أعضاء الفصل و `std :: function`؟

نشر في 2025-03-22
تصفح:106

How to Implement Generic C   Callbacks Using Class Members and `std::function`?

c callback باستخدام عضو الفصل مع التنفيذ العام

بدلاً من الاعتماد على الأساليب الثابتة وتجاوز مؤشرات مثيل الفصل ، يمكن استخدام نهج C أكثر حداثة باستخدام STD :: Function و Std :: Bind. يمثل كائن الوظيفة كيانًا قابل للاستدعاء يمكن تمريره مثل مؤشر الوظيفة العادية. تأخذ طريقة معالج الأحداث AddHandler وظيفة std :: كوسيطة ، حيث لا تحتوي الوظيفة التي تم تمريرها على قيمة إرجاع وتأخذ عددًا صحيحًا كوسيطة.

{ عام: void AddHandler (std :: function رد الاتصال) { cout ربط وظائف محددة

لربط طريقة فئة محددة مع معالج الأحداث ، يتم استخدام std :: bind. std :: bind يحدد هذا المؤشر والوظيفة التي سيتم استدعاؤها عند تشغيل الحدث.
class EventHandler
{
public:
    void addHandler(std::function callback)
    {
        cout  class myClass
{
عام:
    myClass () ؛

    // ملاحظة: لم يعد مميزًا "ثابتًا" ، ويأخذ الوسيطة الفعلية فقط
    رد الفراغ (int x) ؛
خاص:
    int private_x ؛
} ؛

MyClass :: myclass ()
{
    باستخدام المساحة الأمراض المنقولة جنسياً: // لـ `_1`

    private_x = 5 ؛
    Handler-> addHandler (std :: bind (& myclass :: callback ، this ، _1)) ؛
}

void myclass :: callback (int x)
{
    // لم يعد يحتاج إلى حجة صريحة "مثيل" ،
    // كما تم إعداد "هذا" بشكل صحيح
    cout   وظائف ووظائف lambda الحرة 

{ // ... } int main () { // ... Handler-> addHandler (freeStandingCallback) ؛ }

class MyClass
{
public:
    MyClass();

    // Note: No longer marked `static`, and only takes the actual argument
    void Callback(int x);
private:
    int private_x;
};

MyClass::MyClass()
{
    using namespace std::placeholders; // for `_1`

    private_x = 5;
    handler->addHandler(std::bind(&MyClass::Callback, this, _1));
}

void MyClass::Callback(int x)
{
    // No longer needs an explicit `instance` argument,
    // as `this` is set up properly
    cout 
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3