نموذج التقييم المستمر للوسيطة
1. لماذا لا يستطيع المترجم تقييم "i" في وقت الترجمة؟
يتطلب تقييم وقت الترجمة معرفة قيمة "i" قبل تنفيذ البرنامج. ومع ذلك، في الكود المقدم، 'i' هو متغير حلقة يتغير أثناء تنفيذ البرنامج. لا يمكن للمترجم تحديد قيمة 'i' في وقت الترجمة لأنها قيمة معينة ديناميكيًا.
2. هل يمكنني تحقيق الهدف دون تعديل واجهة API؟
نعم، يمكنك استخدام تخصص القالب لإنشاء وظيفة متكررة تتكرر عبر نطاق وسيطات القالب. على سبيل المثال، يمكنك إنشاء دالة:
template
void modify_recursive() {
// Call modify with template argument 'i'
modify();
// Recursively call modify_recursive with the next template argument
if (i ();
}
}
استدعاء "تعديل" باستخدام وسيطة غير ثابتة
لاستدعاء "تعديل" بقيمة ليست ثابتة في وقت الترجمة، يمكنك استخدام تقنية تسمى البرمجة الفوقية للقالب. تتمثل إحدى الطرق في إنشاء فئة قالب تأخذ كائن دالة كوسيطة وتستدعيها بالقيمة المطلوبة:template
struct InvokeWithParam {
InvokeWithParam(F f, int param) : f(f), param(param) {}
void operator()() { f(param); }
F f;
int param;
};
يمكنك بعد ذلك تمرير مثيل InvineWithParam كوسيطة القالب لتعديل:int var = 5;
modify();
سيؤدي هذا إلى استدعاء دالة التعديل بقيمة var. تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3