template
القوالب البرمجية template
template يتيح كتابة دالة أو صنف عامّ يعمل مع أي نوع بيانات، فيولّد المترجم نسخة مخصّصة لكل نوع تُستخدم فعليًا وقت الترجمة.
بدل كتابة نفس دالة max لكل نوع (int، double، string) على حدة، تكتبها مرة واحدة بقالب عام يقبل أي نوع T، والمترجم يولّد تلقائيًا نسخة مترجمة مخصّصة لكل نوع فعلي يُستخدم بالبرنامج (عملية تُسمى instantiation). لا تكلفة أداء وقت التشغيل مقارنة بكتابة نسخة يدوية لكل نوع — كل التخصيص يحدث وقت الترجمة، وهذا سر قوة C++ بمكتبتها القياسية (STL كلها مبنية على القوالب).
الصياغة
template<typename T>
ReturnType funcName(T param) { ... }
template<typename T>
class ClassName { ... };📄 مثال
template<typename T>
T maxValue(T a, T b) {
return (a > b) ? a : b;
}
std::cout << maxValue(3, 7); // T = int → 7
std::cout << maxValue(2.5, 1.1); // T = double → 2.5
std::cout << maxValue(std::string("ب"), std::string("أ")); // T = stringأهم النقاط
| العنصر | الوظيفة |
|---|---|
| typename T / class T | معامل قالب يمثّل نوعًا سيُحدَّد لاحقًا وقت الاستخدام — الكلمتان متطابقتان هنا |
| template<typename T> class | صنف عام بالكامل (مثل std::vector<T>) يعمل مع أي نوع |
| instantiation | توليد المترجم نسخة فعلية مترجمة من القالب لكل نوع محدد يُستخدم |
| معاملات متعددة | template<typename K, typename V> لقوالب تحتاج أكثر من نوع، مثل std::map<K,V> |
💡 نصائح عملية
- استخدم القوالب لتفادي تكرار نفس المنطق لأنواع مختلفة — لكن حافظ على البساطة، فأخطاء القوالب صعبة القراءة أحيانًا
- STL كاملة (vector، map، sort...) أمثلة قوالب حقيقية — فهم template يفتح فهم كيف تعمل المكتبة القياسية داخليًا
⚠️ أخطاء شائعة
- الظن أن القالب دالة واحدة تعمل وقت التشغيل بأي نوع — الحقيقة أن كل نوع يولّد نسخة منفصلة مترجمة بالكامل
- استخدام template بمنطق معقّد جدًا فتصبح رسائل خطأ الترجمة طويلة ومحيّرة للمبتدئين
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.