تخطَّ إلى المحتوى

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 الكامل بالعربي.