// cpp14_demo.cpp
// 编译: g++ -std=c++14 -pthread cpp14_demo.cpp -o cpp14_demo
// 运行: ./cpp14_demo
#include <iostream> // 输入输出
#include <vector> // 动态数组
#include <string> // 字符串
#include <memory> // 智能指针
#include <utility> // std::move / exchange
#include <shared_mutex> // 读写锁
#include <mutex> // 互斥量
#include <thread> // 线程
#include <tuple> // 元组
#include <algorithm> // 算法
#include <chrono> // 时间库
#include <complex> // 复数
// ============================================================
// 全局辅助
// ============================================================
template<typename T> // 变量模板
constexpr T pi = T(3.1415926535897932385); // 每种类型一份 pi
template<typename T> // 圆面积计算
T circular_area(T r) { return pi<T> * r * r; } // 使用对应类型的 pi
auto add_auto(int a, int b) { return a + b; } // 返回类型推导
int global_value = 42; // 全局变量
decltype(auto) get_global() { return global_value; } // 返回引用
constexpr int factorial(int n) { // 放宽的 constexpr
int result = 1; // 局部变量
for (int i = 2; i <= n; ++i) result *= i; // 循环
return result; // 返回结果
}
struct Aggregate { // 聚合类
int x = 10; // 默认值
int y = 20; // 默认值
};
// ============================================================
// main
// ============================================================
int main() { // 程序入口
std::cout << "1. 变量模板:\n"; // 提示
std::cout << " pi<int> = " << pi<int> << "\n"; // int 版
std::cout << " pi<double> = " << pi<double> << "\n"; // double 版
std::cout << " circular_area(2.0) = " << circular_area(2.0) << "\n"; // 计算
std::cout << "2. 泛型 Lambda:\n"; // 提示
auto identity = [](auto x) { return x; }; // 泛型 lambda
std::cout << " identity(3) = " << identity(3) << "\n"; // int
std::cout << " identity(\"hi\") = " << identity("hi") << "\n"; // 字符串
std::cout << "3. Lambda 初始化捕获:\n"; // 提示
auto ptr = std::make_unique<int>(100); // unique_ptr
auto task = [p = std::move(ptr)] { // 移动捕获
std::cout << " captured: " << *p << "\n"; // 输出
};
task(); // 调用 lambda
std::cout << " 原 ptr 空: " << (ptr == nullptr ? "是" : "否") << "\n"; // 检查
std::cout << "4. 返回类型推导:\n"; // 提示
std::cout << " add_auto(3,4) = " << add_auto(3, 4) << "\n"; // 调用
std::cout << "5. decltype(auto):\n"; // 提示
auto& ref = get_global(); // 获取引用
ref = 99; // 修改
std::cout << " global_value = " << global_value << "\n"; // 输出
std::cout << "6. 放宽的 constexpr:\n"; // 提示
constexpr int fact5 = factorial(5); // 编译期计算
static_assert(fact5 == 120, "factorial(5) 应为 120"); // 断言
std::cout << " factorial(5) = " << fact5 << "\n"; // 输出
std::cout << "7. 二进制字面量:\n"; // 提示
int b1 = 0b101010; // 二进制
std::cout << " 0b101010 = " << b1 << "\n"; // 输出 42
std::cout << "8. 数字分隔符:\n"; // 提示
long long big = 123'456'789'012'345LL; // 分隔
std::cout << " big = " << big << "\n"; // 输出
std::cout << "9. 聚合类成员默认初始化:\n"; // 提示
Aggregate agg; // 全默认
Aggregate agg2{5, 6}; // 覆盖
std::cout << " agg: " << agg.x << "," << agg.y
<< " agg2: " << agg2.x << "," << agg2.y << "\n"; // 输出
std::cout << "10. make_unique:\n"; // 提示
auto up = std::make_unique<int>(42); // 单个对象
std::cout << " make_unique: " << *up << "\n"; // 输出
auto up_arr = std::make_unique<int[]>(3);// 数组
up_arr[0] = 1; up_arr[1] = 2; up_arr[2] = 3; // 赋值
std::cout << " array: "; // 提示
for (int i = 0; i < 3; ++i) std::cout << up_arr[i] << " "; // 输出
std::cout << "\n"; // 换行
std::cout << "11. shared_timed_mutex:\n"; // 提示
std::shared_timed_mutex mtx; // 读写锁
int shared_data = 0; // 共享数据
std::thread writer([&] { // 写线程
std::unique_lock<std::shared_timed_mutex> lock(mtx); // 写锁
shared_data = 100; // 修改
std::cout << " 写线程: " << shared_data << "\n"; // 输出
});
writer.join(); // 等待写线程
std::thread reader([&] { // 读线程
std::shared_lock<std::shared_timed_mutex> lock(mtx); // 读锁
std::cout << " 读线程: " << shared_data << "\n"; // 输出
});
reader.join(); // 等待读线程
std::cout << "12. std::exchange:\n"; // 提示
int old_val = 10; // 旧值
int result = std::exchange(old_val, 20); // 取旧换新
std::cout << " old=" << result << " new=" << old_val << "\n"; // 输出
std::cout << "13. integer_sequence:\n"; // 提示
using seq = std::integer_sequence<int, 0, 1, 2, 3, 4>; // 编译期序列
std::cout << " size: " << seq::size() << "\n"; // 输出大小
std::cout << "14. 标准库 UDL:\n"; // 提示
using namespace std::chrono_literals; // 启用时间字面量
auto duration = 10s; // 10 秒