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

كيفية تخزين مؤشرات وظيفة العضو في كائنات `std::function` العامة؟

تم النشر بتاريخ 2024-12-21
تصفح:602

How to Store Member Function Pointers in Generic `std::function` Objects?

تخزين مؤشرات وظيفة العضو في كائنات std العامة::function

عند محاولة تخزين مؤشرات وظيفة العضو من فئة معينة في الخريطة باستخدام std::function، قد يواجه المطورون خطأً: "لا يتم تقييم المصطلح إلى دالة تأخذ 0 وسيطات." ينشأ هذا الخطأ عند تعيين مؤشر وظيفة العضو مباشرةً إلى كائن الوظيفة std::function.

&&&] يكمن جوهر المشكلة في حقيقة أن وظائف العضو غير الثابتة تتطلب مؤشر "هذا" ضمنيًا باعتباره الوسيط الأول . لتصحيح هذا، يجب أن تكون الوسيطة الأولى مرتبطة بشكل صريح.

الحل:

std::function f = std::bind(&Foo ::doSomething, this);
std::function f = std::bind(&Foo::doSomething, this);
يربط هذا الأسلوب بشكل فعال المؤشر "هذا" باعتباره الوسيط الأول، مما يسمح لكائن std::function بالتقاط العضو بشكل صحيح function.

التعامل مع الوظائف ذات المعلمات:بالنسبة لوظائف الأعضاء ذات المعلمات، يجب تحديد العناصر النائبة للإشارة إلى موضع الوسائط المرتبطة.

باستخدام مساحة الاسم std::placeholders; std::function f = std::bind(&Foo::doSomethingArgs, هذا، الأمراض المنقولة جنسيا::العناصر النائبة::_1, std::placeholders::_2);

std::function f = std::bind(&Foo::doSomething, this);
بناء جملة C 11 Lambda:

إذا كان المترجم يدعم C 11 lambdas، فيمكن استخدام نهج أكثر إيجازًا:

std::function f = [=](int a, int b) { this->doSomethingArgs(a, b); };

std::function f = [=](int a, int b) {
    this->doSomethingArgs(a, b);
};
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3