พื้นฐาน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การแทนค่าที่ไม่มีอยู่ด้วย optional
- การเข้าถึงค่า optional
- พื้นฐาน std::expected
- รูปแบบการจัดการข้อผิดพลาด