تخصيص القوالب الجزئي والكامل
خصّص القوالب لأنواع محددة وأنماط جزئية للمعاملات.
تخصيص القوالب الجزئي والكامل درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
عندما لا تكون الصيغة العامة كافية
يحتاج نوع محدد أحيانًا إلى سلوك مخصص. يتيح لك تخصيص القالب توفير تنفيذ ملائم لمعامل محدد.
التخصيص الكامل
حدد النوع أو الأنواع بدقة، ثم وفّر بديلًا كاملًا.
template <typename T>
struct Printer {
void print(T x) { std::cout << x; }
};
template <>
struct Printer<bool> {
void print(bool x) { std::cout << (x ? "true" : "false"); }
};استخدام التخصيص
يختار المترجم التخصيص تلقائيًا عندما تتطابق الأنواع.
Printer<int> pi; pi.print(42); // 42
Printer<bool> pb; pb.print(true); // trueتخصيص قالب دالة
يمكنك أيضًا تخصيص قوالب الدوال، لكن يُفضّل استخدام التحميل الزائد. إذ يتوافق التحميل الزائد بصورة أفضل مع قواعد البحث العادية.
template <typename T> void f(T x) { /* general */ }
template <> void f<int>(int x) { /* int specific */ }لماذا يُفضّل التحميل الزائد على تخصيص الدوال
لا يشارك تخصيص قالب الدالة في حل التحميل الزائد بالطريقة نفسها. أما التحميل الزائد فأوضح، ويتجنب مأزق «لماذا لم يُستدعَ التخصيص الخاص بي؟».
التخصيص الجزئي (للأصناف فقط)
يتيح التخصيص الجزئي ملاءمة التنفيذ مع فئة من الأنواع، مثل المؤشرات أو المراجع أو أي حاوية.
template <typename T>
struct Type { static const char* name() { return "general"; } };
template <typename T>
struct Type<T*> { static const char* name() { return "pointer"; } };
template <typename T>
struct Type<std::vector<T>> { static const char* name() { return "vector"; } };حالات استخدام التخصيص الجزئي
السيناريوهات الشائعة:
- سلوك مختلف لأنواع المؤشرات
- إصدار مُحسّن للأنواع القابلة للنسخ بشكل تافه
- تجاوزات خاصة بالحاويات
تخصيص قوالب std
يمكنك تخصيص القوالب في مساحة الأسماء std (مع بعض القيود)، وأكثر الاستخدامات شيوعًا تخصيص std::hash للأنواع التي يعرّفها المستخدم حتى يمكن تخزينها في std::unordered_map.
template <>
struct std::hash<MyType> {
size_t operator()(const MyType& v) const {
return /* compute hash */;
}
};متى تستخدم التخصيص
استخدم التخصيص عندما:
- يحتاج نوع ما إلى سلوك مختلف جذريًا
- تحتاج إلى مسارات شيفرة محسّنة لأنواع معروفة
- تتكامل مع مكتبة عامة تستخدم السمات
البدائل في C++ الحديث
أضاف C++17 if constexpr، وأضاف C++20 المفاهيم — وغالبًا ما يستبدل كلاهما التخصيص بشيفرة أوضح.
template <typename T>
void print(const T& x) {
if constexpr (std::is_same_v<T, bool>) {
std::cout << (x ? "true" : "false");
} else {
std::cout << x;
}
}تسلسل التخصيصات
عندما ينطبق أكثر من تخصيص، يفوز التخصيص الأكثر تحديدًا. يختار المترجم التخصيص بشكل غير ملتبس — وإلا يُصدر خطأ.
المزالق الشائعة
المزلقان الرئيسيان:
- نسيان
template <>عند إجراء تخصيص كامل - وضع التخصيصات في ملفات الترويسة من دون
inline، مما يؤدي إلى انتهاكات ODR
تحقق سريع
ما نوع التخصيص الذي لا يُسمح به مباشرةً لقوالب الدوال؟
ملخص
يوفر تخصيص القوالب تطبيقات خاصة بأنواع محددة. يثبت التخصيص الكامل جميع المعاملات، بينما يلائم التخصيص الجزئي (لقوالب الأصناف فقط) فئات من الأنواع. وغالبًا ما تنتج البدائل الحديثة مثل if constexpr والمفاهيم شيفرة أوضح.
الأسئلة الشائعة
هل درس «تخصيص القوالب الجزئي والكامل» مجاني؟
نعم — نص درس «تخصيص القوالب الجزئي والكامل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «تخصيص القوالب الجزئي والكامل»؟
خصّص القوالب لأنواع محددة وأنماط جزئية للمعاملات. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تخصيص القوالب الجزئي والكامل»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مراجعة قوالب الدوال والأصناف
- تخصيص القوالب الجزئي والكامل
- القوالب متغيرة المعاملات وحزم المعاملات
- دوال constexpr وif constexpr