C++ Academy · درس

لماذا نستخدم Concepts بدلًا من SFINAE

قارن بين قابلية قراءة Concepts وتقنيات SFINAE التقليدية.

الدرس 1 من 414 خطوة

لماذا نستخدم Concepts بدلًا من SFINAE درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

عصر SFINAE

قبل C++20، كان تقييد القوالب يتطلب استخدام SFINAE (فشل الاستبدال ليس خطأً). كانت هذه الطريقة فعالة، لكنها أنتجت أخطاء غامضة وشيفرة مطولة.

مثال على SFINAE

تقييد قالب دالة بالأنواع الحسابية — قبل C++20.

template <typename T,
          typename = std::enable_if_t<std::is_arithmetic_v<T>>>
T double_it(T x) {
    return x * 2;
}

مشكلة SFINAE

المشكلات:

  • تواقيع قوالب يصعب قراءتها
  • أخطاء مترجم غامضة عند فشل القيود
  • سهولة الوقوع في الأخطاء
  • إضافة كل قيد مزيدًا من الشيفرة التمهيدية

المفاهيم: الحل الواضح

تعبّر مفاهيم C++20 عن القيود مباشرةً. وهي أوضح وأسهل قراءة، وتنتج رسائل أخطاء أفضل بكثير.

#include <concepts>

template <std::integral T>
T double_it(T x) {
    return x * 2;
}

المفاهيم المضمّنة

توفر المكتبة القياسية العديد من المفاهيم في <concepts>:

  • std::integral
  • std::floating_point
  • std::same_as
  • std::convertible_to
  • std::invocable

رسائل أخطاء محسّنة

عند فشل مفهوم، يوضح المترجم المتطلب الذي لم يُستوفَ. أما مع SFINAE، فكنت تحصل على جدار من أخطاء الاستبدال.

المفاهيم بوصفها توثيقًا

يوضح اسم المفهوم الغرض منه: فالدالة المقيدة بـstd::integral تخبر القراء بالضبط بما تتوقعه.

التحميل الزائد للدوال حسب المفهوم

حمّل الدوال تحميلًا زائدًا وفق مفاهيم مختلفة. ويفوز الإصدار المطابق ذي القيود الأكثر تحديدًا.

void f(std::integral auto x)        { /* integers */ }
void f(std::floating_point auto x)  { /* floats */ }

هيمنة المفاهيم

يفهم المترجم متى يكون أحد المفاهيم أكثر تحديدًا من مفهوم آخر. إذ يهيمن std::integral على std::regular في بعض الحالات، ويفضّل حل التحميل الزائد المفهوم الأكثر تحديدًا.

المزج مع القوالب

تعمل المفاهيم مع قوالب الدوال وقوالب الأصناف على حد سواء.

template <std::movable T>
class Buffer { /* ... */ };

قوالب الدوال مختصرة الصياغة

باستخدام المفاهيم، يمكنك استعمال معاملات auto وتقييدها ضمن السطر نفسه.

void greet(std::convertible_to<std::string> auto name) {
    std::cout << "Hello, " << name;
}

الترحيل من SFINAE

اعتمد المفاهيم تدريجيًا. استبدل قالبًا واحدًا مقيدًا بـ SFINAE في كل مرة. وسيساعدك المترجم برسائل أخطاء أوضح.

تحقق سريع

ما الميزة الأساسية لمفاهيم C++20 مقارنةً بـ SFINAE؟

ملخص

تستبدل المفاهيم SFINAE بطريقة أوضح وتصريحية لتقييد القوالب. وتغطي المفاهيم القياسية في <concepts> الحالات الشائعة، بينما تشير الأخطاء مباشرةً إلى المتطلب الذي فشل.

البدء مجانًا

تعلم C++ مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

الأسئلة الشائعة

هل درس «لماذا نستخدم Concepts بدلًا من SFINAE» مجاني؟

نعم — نص درس «لماذا نستخدم Concepts بدلًا من SFINAE» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «لماذا نستخدم Concepts بدلًا من SFINAE»؟

قارن بين قابلية قراءة Concepts وتقنيات SFINAE التقليدية. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «لماذا نستخدم Concepts بدلًا من SFINAE»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. لماذا نستخدم Concepts بدلًا من SFINAE
  2. تعريف Concepts باستخدام requires
  3. استخدام Concepts في القوالب وauto
  4. المفاهيم القياسية الشائعة: Integral وRanges
← العودة إلى C++ Academy