في لغة C، يجب أن تكون وسيطات القالب تعبيرات ثابتة. وهذا يعني أن قيمها يجب أن تكون معروفة في وقت الترجمة. لا يمكن للمترجم تقييم متغير غير ثابت في هذا السياق.
خذ بعين الاعتبار الكود:
template
void modify(){}
لتمرير متغير غير ثابت كوسيطة القالب، قد نكتب:
for(int i = 0; i ();
}
ومع ذلك، يؤدي هذا إلى حدوث خطأ لأن المترجم لا يمكنه تحديد قيمة i في وقت الترجمة. قد يتم تنفيذ نص الحلقة عدة مرات، مما يؤدي إلى تغيير قيمة i.
بدلاً من تمرير متغير غير ثابت مباشرةً، يمكننا استخدام تخصص القالب للتنفيذ مكالمة متكررة:
#include
template
void modify() { std::cout "
void modify() { std::cout "
void modify() {
std::cout " ();
}
int main() {
modify();
}
لاستدعاء التعديل بقيمة غير معروفة في وقت الترجمة، يمكننا استخدام تقنية تسمى البرمجة الوصفية للقالب. إليك مثال مبسط:
#include
template <:tuple>>
struct TupleSize;
template
struct TupleSize<:tuple>> {
static const int value = sizeof...(Args);
};
template
void callModify(int i) {
if constexpr (i ();
callModify(i 1);
}
}
int main() {
int n = 10;
callModify::value>(0);
}
في هذا المثال، callModify يأخذ معامل N وهو حجم الصف الذي يحتوي على النطاق المطلوب من القيم لـ i. تستخدم الوظيفة برنامجًا تعريفيًا متكررًا لإنشاء الاستدعاءات لتعديل ما يصل إلى الحجم المحدد N.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3