编译运行:clang++ -std=c++26 -Wall -Wextra -pthread 测试_第13章_C++23特性.cpp -o t && ./t(需先 cd 测试/)
// 第13章测试:C++23 新特性
#include <print>
#include <format>
#include <expected>
#include <string>
#include <string_view>
#include <vector>
#include <flat_map>
#include <ranges>
int failures = 0;
#define CHECK(expr) \
do { \
if (!(expr)) { \
++failures; \
std::println("FAIL 第{}行: {}", __LINE__, #expr); \
} \
} while (0)
enum class Err { BadInput, Empty };
std::expected<int, Err> parse_int(std::string_view sv) {
if (sv.empty()) return std::unexpected(Err::Empty);
int v = 0;
for (char c : sv) {
if (c < '0' || c > '9') return std::unexpected(Err::BadInput);
v = v * 10 + (c - '0');
}
return v;
}
int main() {
// 13.1 print / println(前面测试一直在用)
std::print("13.1 无换行; ");
std::println("13.1 换行 {}", 1);
// 13.2 expected
auto ok = parse_int("42");
CHECK(ok.has_value());
CHECK(*ok == 42);
auto bad = parse_int("12a");
CHECK(!bad.has_value());
CHECK(bad.error() == Err::BadInput);
auto empty = parse_int("");
CHECK(empty.error() == Err::Empty);
CHECK(ok.value_or(-1) == 42);
auto transformed = ok.transform([](int x) { return x * 2; });
CHECK(*transformed == 84);
// 13.4 flat_map
std::flat_map<std::string, int> fm;
fm["c"] = 3;
fm["a"] = 1;
fm["b"] = 2;
CHECK(fm.size() == 3);
CHECK(fm.contains("a"));
CHECK(fm["b"] == 2);
CHECK(fm.begin()->first == "a"); // 按键有序
// 13.6 contains / zip 替代(两下标循环)
std::string s = "hello world";
CHECK(s.contains("world"));
CHECK(!s.contains("xyz"));
// views::adjacent 可用性测试(新版才有,若编译失败则跳过)
#if __has_include(<ranges>) && defined(__cpp_lib_ranges_adjacent)
std::vector<int> w{1, 2, 3, 4};
int pairs = 0;
for (auto [a2, b2] : w | std::views::adjacent<2>) {
CHECK(b2 == a2 + 1);
++pairs;
}
CHECK(pairs == 3);
#endif
// 13.6 数值 clamp 复习(C++17 特性,本章重点整理)
CHECK(std::clamp(150, 0, 100) == 100);
// format 完整测试
CHECK(std::format("{}", 42) == "42");
CHECK(std::format("{:x}", 255) == "ff");
CHECK(std::format("{:.2f}", 3.14159) == "3.14");
CHECK(std::format("{:>5}", "ab") == " ab");
if (failures == 0) std::println("全部通过");
return failures;
}