0Pricing
C++ Academy · درس

المنطق الشرطي

استخدم std::conditional وif constexpr

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

اختيار الأنواع والفروع

يتيح منطق سمات الأنواع للشيفرة اختيار الأنواع ومسارات التنفيذ وقت الترجمة. والأداتان الأساسيتان هما std::conditional وif constexpr.

std::conditional

تُقيَّم std::conditional_t<cond, A, B> إلى A عندما تكون cond صحيحة، وإلا فتُقيَّم إلى B.

#include <iostream>
#include <type_traits>

int main() {
    using T = std::conditional_t<true, int, double>;
    std::cout << std::is_same_v<T, int> << "\n";
    return 0;
}

اختيار نوع التخزين

من الاستخدامات الشائعة: اختيار نوع واسع للقيم الكبيرة، ونوع ضيق فيما عدا ذلك.

#include <iostream>
#include <type_traits>

template <bool Big>
struct Storage {
    using type = std::conditional_t<Big, long long, short>;
};

int main() {
    Storage<true>::type a = 10;
    std::cout << sizeof(a) << "\n";
    return 0;
}

أساسيات if constexpr

يتجاهل if constexpr (في C++17) الفرع غير المُختار وقت الترجمة. ولا يلزم أن يُترجم للنوع المعطى إلا الفرع المُختار.

#include <iostream>
#include <type_traits>

template <typename T>
void describe(T v) {
    if constexpr (std::is_integral_v<T>)
        std::cout << "integer: " << v << "\n";
    else
        std::cout << "other: " << v << "\n";
}

int main() {
    describe(5);
    describe(2.5);
    return 0;
}

لماذا يتفوق if constexpr على if وقت التشغيل

مع استخدام if العادي، يجب أن يُترجم كلا الفرعين لكل قيمة من T. أما مع if constexpr، فلا يُنشأ مثيل للفرع المرفوض، ولذلك يمكن أن يحتوي على تعليمات خاصة بنوع معين قد تكون غير صالحة بخلاف ذلك.

العمليات الخاصة بالنوع

هذا مستحيل باستخدام if العادي، لأن .length() لن يُترجم مع النوع int.

#include <iostream>
#include <string>
#include <type_traits>

template <typename T>
auto size_of(const T& v) {
    if constexpr (std::is_same_v<T, std::string>)
        return v.length();
    else
        return sizeof(v);
}

int main() {
    std::cout << size_of(std::string("hi")) << "\n";
    std::cout << size_of(42) << "\n";
    return 0;
}

استخدام enable_if مع التحميل الزائد

قبل ظهور if constexpr، كان std::enable_if يختار الدوال ذات التحميل الزائد باستخدام SFINAE. فهو يزيل الدالة من عملية حلّ التحميل الزائد عندما يكون الشرط خاطئًا.

#include <iostream>
#include <type_traits>

template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
void only_int(T v) { std::cout << "int " << v << "\n"; }

int main() {
    only_int(7);
    return 0;
}

دمج الشروط

يمكنكم دمج السمات باستخدام && و|| و! في الشروط وقت الترجمة، تمامًا كما تفعلون مع القيم المنطقية العادية.

#include <iostream>
#include <type_traits>

template <typename T>
void check() {
    if constexpr (std::is_integral_v<T> && !std::is_same_v<T, bool>)
        std::cout << "non-bool integer\n";
    else
        std::cout << "something else\n";
}

int main() {
    check<int>();
    check<bool>();
    return 0;
}

الاختيار التكراري وقت الترجمة

يتيح if constexpr التكرار وقت الترجمة، وهو مفيد لمعالجة tuples أو حزم المعاملات عنصرًا تلو الآخر.

conjunction و disjunction

يوفر C++17 أيضًا std::conjunction وstd::disjunction لتنفيذ AND وOR منطقيين مع الإيقاف المبكر على قائمة من السمات.

اختيار الأداة المناسبة

استخدموا conditional لاختيار نوع، وif constexpr لاختيار تعليمات، وenable_if/المفاهيم للتحكم في حلّ التحميل الزائد. ويفضّل الكود الحديث استخدام if constexpr والمفاهيم لما توفره من وضوح.

اختبار سريع

تذكّروا الفائدة الأساسية من if constexpr.

مراجعة

لقد تعلمتم المنطق الشرطي وقت الترجمة.

  • conditional_t<c,A,B> يختار نوعًا
  • if constexpr يختار التعليمات ويتجاهل الفرع الآخر
  • enable_if يتحكم في حلّ التحميل الزائد باستخدام SFINAE
  • ادمجوا السمات باستخدام العوامل المنطقية

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

هل درس «المنطق الشرطي» مجاني؟

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

ماذا ستتعلم في «المنطق الشرطي»؟

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

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

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

كم من الوقت يستغرق درس «المنطق الشرطي»؟

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

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

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

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

  1. الاستعلام عن الأنواع
  2. تحويل الأنواع
  3. المنطق الشرطي
  4. كتابة سمات أنواع مخصّصة
← العودة إلى C++ Academy