测试_第13章_C++23特性.cpp

← 测试总览 · 目录

编译运行: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;
}