كورس C++ المتقدم – الحلقة الأولى: Templates (القوالب البرمجية)
#برمجة
مقدمة
مرحباً بك في أول حلقة من المستوى المتقدم في C++.
لقد أكملت:
- المستوى المبتدئ
- المستوى المتوسط
- هياكل البيانات الأساسية
- OOP
- STL الأساسية
والآن سنبدأ مرحلة الاحتراف.
أول موضوع سنتعلمه هو:
Templates
وهو من أقوى ميزات C++ وأكثرها استخداماً داخل المكتبات الاحترافية مثل:
وهو السبب الرئيسي وراء وجود:
- Vector
- Queue
- Stack
- Map
- Set
ما هي Templates؟
تخيل أنك كتبت دالة لجمع رقمين:
int add(int a, int b)
{
return a + b;
}
تعمل مع:
int
لكن ماذا لو أردت استخدامها مع:
double
أو:
float
أو:
long
ستضطر لكتابة نفس الدالة عدة مرات.
مثال سيء
int add(int a, int b)
{
return a + b;
}
double add(double a, double b)
{
return a + b;
}
float add(float a, float b)
{
return a + b;
}
الكود بدأ يتكرر.
الحل: Templates
template<typename T>
T add(T a, T b)
{
return a + b;
}
شرح
template<typename T>
تعني:
أنشئ قالباً عاماً لأي نوع بيانات.
أول مثال عملي
#include <iostream>
using namespace std;
template<typename T>
T add(T a, T b)
{
return a + b;
}
int main()
{
cout << add(10,20) << endl;
cout << add(2.5,3.5) << endl;
return 0;
}
الناتج
30
6
كيف يعمل Template؟
عندما تكتب:
add(10,20);
يقوم المترجم بإنشاء:
int add(int a,int b)
خلف الكواليس.
وعندما تكتب:
add(2.5,3.5);
يقوم بإنشاء:
double add(double a,double b)
تلقائياً.
Template مع النصوص
#include <iostream>
using namespace std;
template<typename T>
T maximum(T a, T b)
{
return (a > b) ? a : b;
}
int main()
{
cout << maximum(50,20);
return 0;
}
الناتج
50
إنشاء دالة عامة للطباعة
#include <iostream>
using namespace std;
template<typename T>
void print(T value)
{
cout << value << endl;
}
int main()
{
print(100);
print(5.6);
print("Hello");
return 0;
}
استخدام أكثر من نوع
أحياناً نحتاج نوعين مختلفين.
مثال
template<typename T1, typename T2>
void show(T1 name, T2 age)
{
cout << name << endl;
cout << age << endl;
}
الاستخدام
show("Ahmed",20);
Class Templates
حتى الآن استخدمنا Templates مع الدوال.
لكن يمكن استخدامها مع الكلاسات أيضاً.
مثال
template<typename T>
class Box
{
public:
T value;
void setValue(T v)
{
value = v;
}
T getValue()
{
return value;
}
};
الاستخدام
Box<int> b1;
b1.setValue(100);
cout << b1.getValue();
مثال آخر
Box<string> b2;
b2.setValue("Welcome");
cout << b2.getValue();
كيف يعمل Vector؟
عندما تكتب:
vector<int> numbers;
فإن Vector في الأصل عبارة عن:
template<class T>
ثم يتم استبدال T بـ int.
مثال مشابه
template<typename T>
class Storage
{
private:
T data;
public:
Storage(T d)
{
data = d;
}
void show()
{
cout << data << endl;
}
};
الاستخدام
Storage<int> s1(50);
Storage<string> s2("Hello");
Template غير نوعي (Non-Type Template)
يمكن تمرير قيمة ثابتة أيضاً.
مثال
template<int SIZE>
class Numbers
{
public:
int arr[SIZE];
};
الاستخدام
Numbers<100> nums;
مشروع عملي
إنشاء آلة حاسبة عامة.
#include <iostream>
using namespace std;
template<typename T>
class Calculator
{
public:
T add(T a, T b)
{
return a + b;
}
T sub(T a, T b)
{
return a - b;
}
T mul(T a, T b)
{
return a * b;
}
T divi(T a, T b)
{
return a / b;
}
};
int main()
{
Calculator<double> calc;
cout << calc.add(10.5,5.5);
return 0;
}
مميزات Templates
✔ تقليل تكرار الكود
✔ مرونة عالية
✔ أداء ممتاز
✔ أساس STL
✔ تستخدم في المشاريع الكبيرة
عيوب Templates
❌ رسائل الأخطاء قد تكون طويلة
❌ تزيد وقت الترجمة أحياناً
❌ قد تصبح معقدة عند الاستخدام المفرط
أين تستخدم Templates؟
- STL
- محركات الألعاب
- أنظمة التشغيل
- مكتبات الذكاء الاصطناعي
- البرامج الضخمة
تمارين
التمرين 1
أنشئ Template لدالة جمع.
التمرين 2
أنشئ Template لدالة إيجاد الأكبر.
التمرين 3
أنشئ Class Template لتخزين قيمة.
التمرين 4
أنشئ Class Template يحتوي على مصفوفة.
التمرين 5
اصنع آلة حاسبة عامة تدعم:
- int
- float
- double
ملخص الحلقة الأولى
تعلمنا:
- Function Templates
- Class Templates
- Multiple Templates
- Non-Type Templates
- كيفية عمل STL داخلياً
- بناء مشاريع عامة قابلة لإعادة الاستخدام
في الحلقة الثانية من المستوى المتقدم سنتعلم:
🔥 Exception Handling (معالجة الأخطاء)
وسنتعرف على:
- try
- catch
- throw
- إنشاء أخطاء مخصصة
- حماية البرامج من الانهيار
- بناء أنظمة احترافية لمعالجة الأخطاء
وهذا من أهم المواضيع في البرامج الحقيقية والاحترافية. 🚀

تعليقات
إرسال تعليق