0Pricing
C++ Academy · บทเรียน

พื้นฐาน std::expected

คืนค่าหรือข้อผิดพลาด

พื้นฐาน std::expected เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

ค่าหรือข้อผิดพลาด

std::expected<T, E> (C++23) เก็บค่าที่สำเร็จชนิด T หรือข้อผิดพลาดชนิด E อย่างใดอย่างหนึ่ง แตกต่างจากออปชันนัลตรงที่มีข้อมูลว่า เหตุใดจึงไม่สำเร็จ ให้รวม <expected>

การส่งคืนเมื่อสำเร็จ

เมื่อสำเร็จ ให้ส่งคืนค่าโดยตรง โดยค่านั้นจะถูกเก็บเป็นชนิด "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 เป็นค่าทดแทน

เช่นเดียวกับออปชันนัล 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
}

ออปชันนัลเทียบกับเอ็กซ์เปกเต็ด

std::optional หมายถึง “มีค่า หรือไม่มีอะไรเลย” ส่วน std::expected หมายถึง “มีค่า หรือมีข้อผิดพลาดที่อธิบายไว้” ให้เลือกเอ็กซ์เปกเต็ดเมื่อผู้เรียกจำเป็นต้องทราบสาเหตุของความล้มเหลว

ประเภทข้อผิดพลาดที่มีรายละเอียด

ประเภทข้อผิดพลาด E อาจเป็น enum, struct หรือสตริงข้อความก็ได้ โดยเลือกชนิดที่อธิบายความล้มเหลวในโดเมนของคุณได้ดีที่สุด

#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()
  • เก็บสาเหตุของความล้มเหลวไว้ได้ ต่างจากออปชันนัล

คำถามที่พบบ่อย

บทเรียน “พื้นฐาน std::expected” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “พื้นฐาน std::expected” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐาน std::expected”

คืนค่าหรือข้อผิดพลาด คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “พื้นฐาน std::expected” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การแทนค่าที่ไม่มีอยู่ด้วย optional
  2. การเข้าถึงค่า optional
  3. พื้นฐาน std::expected
  4. รูปแบบการจัดการข้อผิดพลาด
← กลับไปที่ C++ Academy