std::expected — type-safe error handling without exceptions.
1#include <expected>23// Error types4enum class Error { NotFound, InvalidInput, NetworkError };56std::expected<int, Error> divide(int a, int b) {7 if (b == 0) return std::unexpected(Error::InvalidInput);8 return a / b;9}1011// Chain operations12auto result = divide(10, 2)13 .transform([](int val) { return val * 10; })14 .and_then([](int val) -> std::expected<int, Error> {15 if (val > 50) return std::unexpected(Error::NetworkError);16 return val;17 });1819// Match20if (result) {21 std::cout << "Value: " << *result;22} else {23 switch (result.error()) {24 case Error::NotFound: std::cout << "Not found"; break;25 case Error::InvalidInput: std::cout << "Invalid"; break;26 case Error::NetworkError: std::cout << "Network"; break;27 }28}2930// Value or default31int val = divide(10, 0).value_or(-1); // -13233// Error transformation34auto result2 = divide(10, 0)35 .transform_error([](Error e) {36 return "Error: " + std::to_string(static_cast<int>(e));37 });
Patterns: