دوال constexpr وif constexpr
قيّم الشيفرة أثناء الترجمة باستخدام constexpr، ونفّذ التفرّع باستخدام if constexpr.
دوال constexpr وif constexpr درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
التقييم وقت الترجمة
تخبر الكلمة المفتاحية constexpr المترجم بأن «يقيّم هذا وقت الترجمة متى أمكن». ولا تفرض الحسابات وقت الترجمة أي تكلفة وقت التشغيل.
المتغيرات constexpr
يجب تهيئة متغير constexpr بتعبير ثابت. وتُثبّت النتيجة وقت الترجمة.
constexpr int BUFFER_SIZE = 1024;
constexpr double PI = 3.14159265358979;دوال constexpr
وسم الدوال بالكلمة constexpr يتيح تشغيلها وقت الترجمة عند استدعائها بوسائط ثابتة.
constexpr int factorial(int n) {
return (n <= 1) ? 1 : n * factorial(n - 1);
}
constexpr int five_fact = factorial(5); // computed at compile timeالرجوع إلى وقت التشغيل
يمكن أيضًا استدعاء دالة constexpr بقيم وقت التشغيل، وفي هذه الحالة تعمل وقت التشغيل.
int n = read_input();
int result = factorial(n); // runtime callقيود دوال constexpr
قبل C++14:
- عبارة إرجاع واحدة فقط
- لا توجد حلقات
- لا يمكن تعديل الحالة المحلية
خفف C++14 هذه القيود، وأضاف C++17 وC++20 المزيد منها (try-catch والتخصيص الديناميكي والدوال الافتراضية).
consteval (C++20)
افرض التقييم وقت الترجمة باستخدام consteval. ويؤدي استدعاء دالة consteval بوسائط غير ثابتة إلى حدوث خطأ.
consteval int square(int x) { return x * x; }
constexpr int c = square(5); // OK
int x = 5;
// int r = square(x); // ERRORconstinit (C++20)
تضمن constinit تهيئة المتغير وقت الترجمة، لكنها تسمح بتعديله وقت التشغيل.
if constexpr (C++17)
يُعد if constexpr فرعًا يُحسم وقت الترجمة. ولا يُترجم الفرع الذي لم يُختر حتى، مما يجعله مفيدًا للقوالب.
template <typename T>
void print(const T& value) {
if constexpr (std::is_pointer_v<T>) {
std::cout << "pointer: " << *value;
} else {
std::cout << value;
}
}التخلص من SFINAE
يستبدل if constexpr أنماط SFINAE المعقدة بمنطق شرطي واضح. وبالاقتران مع سمات الأنواع، يجعل الشيفرة العامة أسهل بكثير في القراءة.
خوارزميات وقت الترجمة
يتيح لك C++ الحديث كتابة خوارزميات معقدة على نحو مدهش تعمل بالكامل وقت الترجمة، مثل تجزئة السلاسل النصية وإنشاء الجداول والمحللات المصغرة.
constexpr auto fnv1a(std::string_view s) {
uint32_t h = 2166136261u;
for (char c : s) {
h = (h ^ static_cast<uint8_t>(c)) * 16777619u;
}
return h;
}
constexpr auto x = fnv1a("hello");القوالب مع constexpr
تُعد دوال constexpr العامة مزيجًا قويًا — إذ تتيح كتابة شيفرة عامة مرنة الأنواع وتقييمها وقت الترجمة.
التشخيص
تُبلغ أخطاء وقت الترجمة في شيفرة constexpr عن مواضع مفصلة. وتتميز المترجمات الحديثة بقدرة جيدة على تحديد الخطوة التي سببت الخطأ.
تحقق سريع
ما الذي يفعله if constexpr ولا يفعله if العادي؟
ملخص
يتيح constexpr التقييم وقت الترجمة، ويفرضه consteval، بينما يضمن constinit التهيئة وقت الترجمة. ويتفرع if constexpr وقت الترجمة؛ فلا يُنشأ أبدًا الفرع الذي لم يُختر، مما يستبدل SFINAE في حالات كثيرة.
الأسئلة الشائعة
هل درس «دوال constexpr وif constexpr» مجاني؟
نعم — نص درس «دوال constexpr وif constexpr» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «دوال constexpr وif constexpr»؟
قيّم الشيفرة أثناء الترجمة باستخدام constexpr، ونفّذ التفرّع باستخدام if constexpr. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «دوال constexpr وif constexpr»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مراجعة قوالب الدوال والأصناف
- تخصيص القوالب الجزئي والكامل
- القوالب متغيرة المعاملات وحزم المعاملات
- دوال constexpr وif constexpr