// ===== CodeLab: C++23 新特性:std::expected、deducing this 等前沿特性 =====
// 来源: https://aoerliang.dpdns.org/articles/cpp23-features
// 以下代码片段按文章出现顺序拼接, 共 5 段

// ----- 片段 1 (cpp) -----
#include <expected>
#include <iostream>
#include <string>

enum class Error { BadFormat, OutOfRange };

// 解析字符串为整数:成功返回 int,失败返回 Error
std::expected<int, Error> parse_int(const std::string& s) {
    try {
        std::size_t pos = 0;
        int value = std::stoi(s, &pos);
        if (pos != s.size()) return std::unexpected(Error::BadFormat);
        return value;
    } catch (...) {
        return std::unexpected(Error::BadFormat);
    }
}

int main() {
    auto ok = parse_int("42");
    auto bad = parse_int("abc");

    std::cout << (ok ? *ok : -1) << std::endl;       // 42
    std::cout << (bad ? *bad : -1) << std::endl;     // -1

    if (!bad) {
        std::cout << "错误码: "
                  << static_cast<int>(bad.error()) << std::endl;
    }
    return 0;
}

// ----- 片段 2 (cpp) -----
#include <iostream>

struct Counter {
    int count = 0;

    // 显式对象参数:自动适配 const/非 const 调用
    int get(this const Counter& self) { return self.count; }

    Counter& inc(this Counter& self) {
        ++self.count;
        return self;
    }
};

int main() {
    Counter c;
    c.inc().inc();            // 链式调用
    std::cout << c.get() << std::endl;   // 2

    const Counter cc = c;
    std::cout << cc.get() << std::endl;  // const 对象也能调用
    return 0;
}

// ----- 片段 3 (cpp) -----
#include <print>

int main() {
    std::println("Hello, C++23!");
    std::println("圆周率约等于 {:.2f}", 3.14159);
    std::println("{} 年发布了 C++{}", 2023, 23);
    return 0;
}

// ----- 片段 4 (cpp) -----
#include <optional>
#include <print>
#include <ranges>
#include <string>
#include <vector>

int main() {
    // zip:并行遍历两个容器,结构化绑定拆开
    std::vector<int> ids = {1, 2, 3};
    std::vector<std::string> names = {"Alice", "Bob", "Carol"};
    for (auto [id, name] : std::views::zip(ids, names)) {
        std::println("{}: {}", id, name);
    }

    // ranges::to:视图直接收集成 vector
    auto doubled = std::views::iota(1, 6)
        | std::views::transform([](int x) { return x * 2; })
        | std::ranges::to<std::vector<int>>();

    // optional 链式变换
    std::optional<int> o = 21;
    auto msg = o.transform([](int v) { return v * 2; })
                .transform([](int v) { return "答案是 " + std::to_string(v); });
    std::println("{}", msg.value_or("无值"));
    return 0;
}

// ----- 片段 5 (cpp) -----
# 编译并运行(std::print 需要 GCC 14+)
g++ -std=c++23 main.cpp -o main
./main

# Clang 建议 17+,配合 libc++
clang++ -std=c++23 -stdlib=libc++ main.cpp -o main
