أساسيات 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تمثيل الغياب باستخدام optional
- الوصول إلى قيم optional
- أساسيات std::expected
- أنماط معالجة الأخطاء