"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا لا يمكن استخدام المتغيرات غير الثابتة كوسائط قالب في لغة C++؟

لماذا لا يمكن استخدام المتغيرات غير الثابتة كوسائط قالب في لغة C++؟

تم النشر بتاريخ 2025-01-12
تصفح:777

Why Can\'t Non-Constant Variables Be Used as Template Arguments in C  ?

لماذا لا يمكن تمرير متغير غير ثابت كوسيطة قالب؟

في لغة 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