// C++23 特性演示:std::expected、std::print、// std::span、std::to_underlying 等#include<array>#include<charconv>#include<expected>#include<format>#include<print>#include<span>#include<string>#include<string_view>#include<type_traits>#include<utility>#include<vector>using namespace std::literals;// 1. C++23 枚举类底层类型转换:// std::to_underlying(替代手动static_cast)enum class Color : uint8_t{ Red = 1, Green = 2, Blue = 3};// 2. C++23 std::expected:类型安全的错误处理[[nodiscard]] std::expected<int, std::string> ParseInt(std::string_view s){ int val; // C++17/23 std::from_chars:高性能字符串转数值(无内存分配) const auto [ptr, ec] = std::from_chars(s.data(), s.data() + s.size(), val); if (ec == std::errc() && ptr == s.data() + s.size()) { return val; // 成功:返回std::expected<int, ...>,存储有效值 } return std::unexpected(std::string("解析失败:非有效整数")); // 失败:返回错误信息}// 3. C++23 std::span 增强:编译期固定大小、范围遍历voidDemoSpan(){ std::vector<int> vec = {10, 20, 30, 40, 50}; std::array<int, 3> arr = {100, 200, 300}; std::print("\n=== std::span 增强(C++23)===\n"); // 动态大小span(适配任意连续容器) std::span<int> s1(vec); std::print("动态span遍历:"); for (int x : s1) std::print("{} ", x); std::print("\n"); // C++23 编译期固定大小span(更高效,编译期检查越界) std::span<int, 3> s2(arr); // 大小3编译期确定 s2[1] = 250; // 直接修改底层array std::print("固定大小span遍历:"); for (int x : s2) std::print("{} ", x); std::print("\n"); // span切片(C++20/23):s.subspan(起始位置, 长度) std::span<int> s3 = s1.subspan(1, 3); std::print("span切片 [1,3):"); for (int x : s3) std::print("{} ", x); std::print("\n");}// 4. C++23 if consteval:编译期/运行期条件分支template <typename T>constexprautoGetValue(T val){ if consteval { // 编译期执行分支:仅当函数在常量表达式上下文中调用时 return std::format("编译期值:{}", val); } else { // 运行期执行分支:普通调用时 return std::format("运行期值:{}", val); }}// 5. C++23 其他小特性演示voidDemoOtherFeatures(){ std::print("\n=== 其他C++23核心小特性 ===\n"); // (1) std::byteswap:通用字节交换(支持整数/枚举,跨平台) uint32_t num = 0x12345678; uint32_t swapped = std::byteswap(num); std::print("字节交换:0x{:x} -> 0x{:x}\n", num, swapped); // (2) std::to_underlying:枚举类转底层类型(类型安全,无需手动static_cast) Color c = Color::Green; auto c_val = std::to_underlying(c); std::print("枚举底层值:Color::Green -> {}\n", c_val); // (3) C++23 std::print:格式化输出(替代printf/cout,更简洁、高效、类型安全) std::string name = "C++23"; double version = 23.0; std::print("格式化输出:Hello, {}! 版本:{:.1f}\n", name, version); // (4) if consteval 编译期/运行期分支演示 constexpr int constexpr_val = 42; // 编译期常量 int runtime_val = 100; // 运行期变量 std::print("if consteval(编译期):{}\n", GetValue(constexpr_val)); std::print("if consteval(运行期):{}\n", GetValue(runtime_val));}// 主函数:串联所有C++23特性演示intmain(){ try { // 演示std::print(C++23核心输出特性) std::print("========== C++23 核心特性完整演示 ==========\n\n"); // 1. std::expected 错误处理 std::print("=== std::expected 类型安全错误处理 ===\n"); auto res1 = ParseInt("12345"); auto res2 = ParseInt("abc123"); if (res1) { // 直接判断是否成功(operator bool) std::print("解析成功:{}\n", *res1); // 解引用获取有效值 } if (!res2) { std::print("解析失败:{}\n", res2.error()); // error()获取错误信息 } // 2. std::span 增强 DemoSpan(); // 3. 其他C++23特性 DemoOtherFeatures(); std::print("\n========== C++23 特性演示结束 ==========\n"); return 0; } catch (const std::exception& e) { std::print("异常:{}\n", e.what()); return 1; }}