std::function والكائنات القابلة للاستدعاء بعد محو النوع
استخدم std::function لمحو الأنواع، وافهم تحسين المخزن المؤقت الصغير.
std::function والكائنات القابلة للاستدعاء بعد محو النوع درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
المشكلة: نوع واحد لكائنات قابلة للاستدعاء متعددة
لكل لامبدا نوع فريد. ولكل مؤشر دالة نوع مختلف. نحتاج إلى نوع واحد يمكنه الاحتفاظ بأي منها، وهو std::function.
معامل القالب
يتلقى std::function<Signature> نوع الإرجاع وأنواع المعاملات. ويقبل أي كائن قابل للاستدعاء بهذه التوقيعة.
#include <functional>
std::function<int(int, int)> op;
op = [](int a, int b) { return a + b; };
std::cout << op(3, 4); // 7تخزين كائنات قابلة للاستدعاء مختلفة
يمكن لمتغير std::function نفسه الاحتفاظ بلامبدا أو مؤشر دالة أو كائن دالة، ما دامت التوقيعة متطابقة.
std::function<int(int)> f;
f = [](int x) { return x * 2; }; // lambda
f = ::abs; // function pointer
f = std::negate<int>{}; // functorمحو النوع
تستخدم std::function داخليًا محو النوع؛ إذ تخزّن أي كائن قابل للاستدعاء وتخفي نوعه الحقيقي خلف واجهة موحّدة. وغالبًا ما يُنفَّذ ذلك باستخدام تخصيص صغير على الكومة.
تكلفة الأداء
يتضمن الاستدعاء عبر std::function استدعاءً غير مباشر، مشابهًا للدالة الافتراضية. وهو أبطأ من استدعاء لامبدا المباشر. تجنبوه في المسارات الساخنة.
متى نستخدم std::function
استخدموها عندما:
- تخزّنون عمليات الاستدعاء الراجعة في حاوية أو كعضو في فئة
- تُرجعون كائنًا قابلًا للاستدعاء من دالة
- تبنون نظامًا للإضافات أو الأحداث
std::function فارغة
تكون std::function المنشأة افتراضيًا فارغة. ويؤدي استدعاؤها إلى إطلاق std::bad_function_call.
std::function<void()> f;
if (f) f(); else std::cout << "no callback set";مؤشرات دوال الأعضاء
اربطوا دالة عضو باستخدام std::bind، أو غلّفوها داخل لامبدا.
struct Obj { void greet(int) {} };
Obj o;
std::function<void(int)> cb = [&](int n) { o.greet(n); };مقارنة مع مؤشرات الدوال
لا تستطيع مؤشرات الدوال تخزين الحالة. أما std::function فتستطيع ذلك، مقابل تكلفة الاستدعاءات غير المباشرة.
مقارنة مع القوالب
تُخصّص القوالب ذات المعاملات القابلة للاستدعاء وقت الترجمة، ولذلك فهي الأسرع. أما std::function فتحل النوع وقت التشغيل، ولذلك فهي أبطأ لكنها أكثر مرونة.
template <typename F>
void run(F f) { f(); } // compile-time, no overhead
void run(std::function<void()> f) { f(); } // runtime, type erasurestd::function في C++23: std::function_ref
أضافت C++23 النوع std::function_ref، وهو عرض غير مالك لكائن قابل للاستدعاء. ويتجنب تخصيص الكومة عندما يكون العمر محددًا.
البدائل
تتوفر بدائل خفيفة، منها: std::move_only_function (C++23) وtl::function_ref وfolly::Function. اختاروا ما يناسب احتياجاتكم.
تحقق سريع
ما العيب الأساسي في std::function؟
مراجعة
تخزّن std::function<Signature> أي كائن قابل للاستدعاء ذي توقيعة متطابقة. وهي مفيدة لعمليات الاستدعاء الراجعة والإضافات وتعدد الأشكال وقت التشغيل للكائنات القابلة للاستدعاء، مقابل تكلفة الاستدعاءات غير المباشرة.
الأسئلة الشائعة
هل درس «std::function والكائنات القابلة للاستدعاء بعد محو النوع» مجاني؟
نعم — نص درس «std::function والكائنات القابلة للاستدعاء بعد محو النوع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «std::function والكائنات القابلة للاستدعاء بعد محو النوع»؟
استخدم std::function لمحو الأنواع، وافهم تحسين المخزن المؤقت الصغير. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «std::function والكائنات القابلة للاستدعاء بعد محو النوع»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- كائنات الدوال والدوال الكائنية
- التقاطات Lambda بالقيمة وبالمرجع وmutable
- Lambdas العامة وعمليات الإغلاق في C++14
- std::function والكائنات القابلة للاستدعاء بعد محو النوع