0Pricing
C++ Academy · درس

أساسيات std::expected

أعد القيم أو الأخطاء

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

قيم أم أخطاء

يحتوي std::expected<T, E> ‏(C++23) إما على قيمة ناجحة من النوع T أو على خطأ من النوع E. وبخلاف optional، فإنه يحمل سبب الفشل. أدرجوا <expected>.

إرجاع النجاح

عند النجاح، تعيدون القيمة مباشرةً؛ فتُخزَّن باعتبارها النوع «المتوقَّع» T.

#include <expected>
#include <iostream>
std::expected<int, std::string> parse(bool ok) {
    if (ok) return 100;
    return std::unexpected("bad input");
}
int main() {
    auto r = parse(true);
    if (r) std::cout << *r << "\n";
}

إرجاع خطأ

غلّفوا الخطأ داخل std::unexpected(...) للإشارة إلى الفشل مع الاستمرار في إرجاع النوع نفسه.

#include <expected>
#include <iostream>
#include <string>
std::expected<int, std::string> div(int a, int b) {
    if (b == 0) return std::unexpected("divide by zero");
    return a / b;
}
int main() {
    auto r = div(8, 0);
    if (!r) std::cout << r.error() << "\n";
}

التحقق من النجاح

اختبروا النتيجة في سياق منطقي أو باستخدام has_value(). تعني القيمة true أنها تحتوي على القيمة، بينما تعني false أنها تحتوي على الخطأ.

#include <expected>
#include <iostream>
int main() {
    std::expected<int, int> r = 5;
    std::cout << r.has_value() << "\n"; // 1
}

قراءة القيمة

استخدموا *r أو r.value() لقراءة قيمة النجاح. ترمي value() الاستثناء std::bad_expected_access إذا كانت النتيجة تحتوي فعليًا على خطأ.

#include <expected>
#include <iostream>
int main() {
    std::expected<int, std::string> r = 7;
    if (r) std::cout << r.value() << "\n";
}

قراءة الخطأ

عندما تكون النتيجة في حالة الخطأ، تعيد r.error() كائن الخطأ.

#include <expected>
#include <iostream>
#include <string>
std::expected<int, std::string> f() { return std::unexpected("nope"); }
int main() {
    auto r = f();
    if (!r) std::cout << "error: " << r.error() << "\n";
}

القيمة البديلة باستخدام value_or

كما في optional، تعيد value_or(fallback) قيمة النجاح أو قيمة افتراضية دون فحص الخطأ.

#include <expected>
#include <iostream>
std::expected<int, std::string> f() { return std::unexpected("x"); }
int main() {
    std::cout << f().value_or(0) << "\n"; // 0
}

optional مقابل expected

تعبّر std::optional عن «قيمة أو لا شيء»، بينما تعبّر std::expected عن «قيمة أو خطأ موصوف». اختاروا expected عندما يحتاج المستدعون إلى معرفة سبب الفشل.

أنواع أخطاء غنية

يمكن أن يكون نوع الخطأ E تعدادًا أو بنيةً أو سلسلة رسالة، أيًّا كان النوع الذي يصف حالات الفشل في نطاقكم على أفضل نحو.

#include <expected>
#include <iostream>
enum class Err { NotFound, Denied };
std::expected<int, Err> get(bool ok) {
    if (ok) return 1;
    return std::unexpected(Err::Denied);
}
int main() {
    auto r = get(false);
    if (!r) std::cout << (int)r.error() << "\n";
}

لا حاجة إلى الاستثناءات

تتيح لكم std::expected تمرير حالات الفشل باعتبارها قيم إرجاع عادية، وهذا مفيد عندما تكون الاستثناءات معطّلة أو مكلفة.

ملاحظة حول التوفّر

تُعدّ std::expected ميزةً في C++23؛ تأكدوا من أن المصرّف وخيار المعيار لديكم، مثل -std=c++23، يدعمانها قبل استخدامها.

تحقّق سريع

تحققوا من فهمكم لـ std::expected.

مراجعة

لقد تعلّمتم std::expected:

  • تحتوي إما على قيمة (T) أو خطأ (E).
  • تُرجِع النجاح مباشرةً، وتمرّر الأخطاء عبر std::unexpected.
  • تقرأون القيمة باستخدام */value()، والخطأ باستخدام error().
  • تحمل سبب الفشل، بخلاف optional.

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

هل درس «أساسيات std::expected» مجاني؟

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

ماذا ستتعلم في «أساسيات std::expected»؟

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

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

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

كم من الوقت يستغرق درس «أساسيات std::expected»؟

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

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

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

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

  1. تمثيل الغياب باستخدام optional
  2. الوصول إلى قيم optional
  3. أساسيات std::expected
  4. أنماط معالجة الأخطاء
← العودة إلى C++ Academy