测试_第12章_C++20特性.cpp

← 测试总览 · 目录

编译运行:clang++ -std=c++26 -Wall -Wextra -pthread 测试_第12章_C++20特性.cpp -o t && ./t(需先 cd 测试/

// 第12章测试:C++20 新特性
#include <print>
#include <ranges>
#include <compare>
#include <concepts>
#include <span>
#include <string>
#include <vector>
#include <algorithm>
#include <chrono>
#include <numeric>
#include <thread>

namespace ch = std::chrono;

int failures = 0;
#define CHECK(expr)                                                         \
    do {                                                                    \
        if (!(expr)) {                                                      \
            ++failures;                                                     \
            std::println("FAIL 第{}行: {}", __LINE__, #expr);              \
        }                                                                   \
    } while (0)

// 12.3 三路比较
struct Point {
    int x, y;
    auto operator<=>(const Point&) const = default;
};

// 12.4 span
int sum_span(std::span<const int> data) {
    int s = 0;
    for (int x : data) s += x;
    return s;
}

// 12.5 consteval
consteval int sq(int n) { return n * n; }

int main() {
    // 12.2 ranges
    std::vector<int> v{5, 3, 1, 4, 2};
    std::ranges::sort(v);
    CHECK(std::ranges::is_sorted(v));

    // 视图流水线:偶数平方和
    auto view = std::views::iota(1, 11)
        | std::views::filter([](int n) { return n % 2 == 0; })
        | std::views::transform([](int n) { return n * n; });
    int s = 0;
    for (int x : view) s += x;
    CHECK(s == 220);                                    // 4+16+36+64+100

    // take / drop / reverse
    std::vector<int> taken;
    for (int x : v | std::views::take(3)) taken.push_back(x);
    CHECK((taken == std::vector<int>{1, 2, 3}));
    std::vector<int> dropped;
    for (int x : v | std::views::drop(2)) dropped.push_back(x);
    CHECK((dropped == std::vector<int>{3, 4, 5}));
    std::vector<int> rev;
    for (int x : v | std::views::reverse) rev.push_back(x);
    CHECK((rev == std::vector<int>{5, 4, 3, 2, 1}));

    // 12.3 三路比较
    Point p1{1, 2}, p2{1, 3};
    CHECK(p1 < p2);
    CHECK(p1 <= p2);
    CHECK(p1 != p2);
    Point p3{1, 2};
    CHECK(p1 == p3);
    // 配合排序
    std::vector<Point> pts{{2, 1}, {1, 2}, {1, 1}};
    std::ranges::sort(pts);
    CHECK(pts[0].x == 1 && pts[0].y == 1);

    // 12.4 span
    int arr[] = {1, 2, 3};
    std::vector<int> vec{4, 5, 6};
    CHECK(sum_span(arr) == 6);
    CHECK(sum_span(vec) == 15);

    // 12.5 consteval
    constexpr int r = sq(5);
    CHECK(r == 25);

    // 12.8 线程测试(你的 libc++ 无 jthread,用 std::thread + 手动 join)
    int result = 0;
    {
        std::thread t([&] { result = 42; });
        t.join();                                       // 等线程结束
    }
    CHECK(result == 42);

    // 12.9 chrono
    auto now = ch::system_clock::now();
    auto today = ch::floor<ch::days>(now);
    auto tomorrow = today + ch::days(1);
    CHECK(tomorrow > today);
    auto dur = tomorrow - today;
    CHECK(ch::duration_cast<ch::hours>(dur).count() == 24);

    // 12.10 指定初始化
    struct Config { int width = 800; int height = 600; };
    Config cfg{.width = 1024};
    CHECK(cfg.width == 1024 && cfg.height == 600);

    if (failures == 0) std::println("全部通过");
    return failures;
}