شرح C++

القوالب (Templates)

لماذا القوالب؟

تخيّل دالة تُرجع الأكبر بين قيمتين. ستحتاج نسخة لكل نوع (int, double, string...). القوالب تكتبها مرّة واحدة لكل الأنواع:

template <typename T>
T getMax(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    cout << getMax(3, 7);         // 7 (int)
    cout << getMax(2.5, 1.5);     // 2.5 (double)
    cout << getMax(string("أ"), string("ب"));   // ب (string)
}

T نوع عام يُملأ تلقائيًّا حسب الوسائط.

قالب بعدّة أنواع

template <typename T, typename U>
void printPair(T first, U second) {
    cout << first << " - " << second;
}

printPair(1, "نص");      // 1 - نص
printPair(3.14, true);   // 3.14 - 1

أصناف القوالب

صنف يعمل مع أي نوع — هكذا بُنيت حاويات STL:

template <typename T>
class Box {
private:
    T content;
public:
    void set(T value) { content = value; }
    T get() { return content; }
};

int main() {
    Box<int> intBox;
    intBox.set(42);
    cout << intBox.get();   // 42

    Box<string> strBox;
    strBox.set("مرحبًا");
    cout << strBox.get();   // مرحبًا
}

لاحظ تحديد النوع عند الإنشاء: Box<int> وBox<string>.

القوالب وSTL

💡 كل مكتبة STL (vector، map، set...) مبنية على القوالب — لهذا تكتب vector<int> وvector<string>. فهم القوالب يجعلك تفهم STL بعمق.

أخطاء شائعة

  • توقّع عمل القالب مع نوع لا يدعم العملية المستخدمة (مثل > على نوع بلا مقارنة).
  • نسيان تحديد النوع عند إنشاء كائن من صنف قالب.

🎯 التالي: معالجة الاستثناءات.