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

هل تؤثر وسيطة القالب الخاصة بـ `std::function` على نوعها أثناء إنشاء الكائن؟

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

Does the Template Argument of `std::function` Influence its Type During Object Construction?

هل وسيطة القالب الخاصة بـ std::function متضمنة في نوعها؟

مقدمة المشكلة

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

#include 

using namespace std;

int a(const function& f) { return f(); }
int a(const function& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }

int main() {
    a(x); // Call is ambiguous.
    a(y); // Call is ambiguous.
}

ينبع الغموض من حقيقة أنه يمكن إنشاء كل من الدالة والدالة من مؤشر دالة عام. يقدم هذا عدة تطابقات محتملة للتحميلات الزائدة للدالة.

حل الغموض

يعتبر توقيع وسيطة القالب لـ std::function جزءًا من نوعه أثناء الإعلان والتعريف. ومع ذلك، ليس هذا هو الحال أثناء إنشاء الكائن.

std::function، مثل العديد من الكائنات الوظيفية في لغة C، تستخدم تقنية تسمى محو النوع. وهذا يمكّنه من قبول كائنات أو وظائف عشوائية، طالما أنها تلبي التوقيع المتوقع عند استدعائها. الجانب السلبي هو أن الأخطاء المتعلقة بالتوقيعات غير المتطابقة تحدث في عمق التنفيذ، وليس على مستوى المنشئ.

التحايل على الغموض

توجد ثلاثة خيارات أساسية للتحايل على هذا الغموض:

  • صب النوع الصريح: قم بتوجيه مؤشرات الوظيفة يدويًا إلى التوقيع المحدد المطلوب من قبل المقصود التحميل الزائد.
  • التفاف كائن الوظيفة : قم بإنشاء كائن دالة من النوع المناسب وتمريره بدلاً من ذلك.
  • برمجة Metaprogramming (TMP) : الاستخدام TMP لإنشاء دالة بالتوقيع المطلوب، مع تجنب القوالب الصريحة.

الاستنتاج

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

أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3