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