Heng_Xin 学习C++, 并且做实验所使用的项目.
Tip
部分内容是以前写的, 会带有 _大写, __* 命名风格; 这是 UB 的 (cppreference: identifiers); 但是太多了, 这里仅是我实验使用的罢了. 基本上写了就不会再看了. 有用的会被迁移到其他地方, 不会继续更新了. 日后绝对不会这样写了~
在全局命名空间中,以下划线开头的标识符 或者 双下划线或以下划线开头后跟大写字母的标识符 是保留字。(除了
operator ""_id字面量)
-
长期需更新:
- std的剖析! (包含一些stl源码的实现)
- 01-constexpr
编译期操作- 编译期if (待更新C++11的基于模版的实现)
- 编译期for (递归/迭代的实现) (内含
std::make_index_constexpr系列とstd::visitの秘密) - 玩具: 编译期toString
- 玩具: 编译期求质数、质数筛(性能较差)
- 02-tuple
- tuple (包含
get(tuple)、tuple_size_v、make_tuple、tie的实现,引用多态真奇妙) - trivially_copyable的tuple
- tuple (包含
- 03-memory
- 04-sort
- 05-完美哈希
- 06-简单的哈希表的实现
- unordered_map (笔试题)
- 坑:
- std::is_convertible、 is_constructible 实现
- 01-constexpr
- 实验 & 学习
- 01-使用模版名称二阶段查找, 规避循环依赖问题 (虽然没有任何实际用处)
- 02-CRTP
- 03-协程
- 暂时不提供示例(因为太乱了), 请见我的笔记: 协程速记
- 04-使用
constexpr检测UB - 05-深入学习虚析构的各种情况, 并且简单实现了shared_ptr智能指针的类型擦除
- 06-学习全局运算符重载和自定义字面量
- 07-类型萃取
- 实验代码 (实现了
is_void_v/remove_reference_t/is_same_v)
- 实验代码 (实现了
- 08-Lambda
- 实验代码 (
auto&&做参数的 Lambda, 其实例化后, 类型也是不同的!(相当于延迟实例化了), 因此即便使用模板传参, 模板也一直模板...)
- 实验代码 (
- 09-auto
- 对于auto返回值的讨论 讨论了
auto、auto&、auto&&、decltype(auto)在各种常见情况下作为函数返回值时候的效果, 对比其不同.
- 对于auto返回值的讨论 讨论了
- 10-临时对象声明周期探索实验
- 11-模板名字查找的实验
- 模板函数与类中的模板函数在重载时候的区别 (全局模板函数指定具体类型时候, 是当场实例化, 不会二阶段查找; 而类中本身就知道本类的所有声明, 因此可以找到后面的方法声明)
- 测试类的特化、偏特化、全特化在某些情况下是否有先后顺序问题 (有, 如果主模板被实例化, 而对应匹配的子模板没有实例化(声明顺序引起的), 就会导致原本期望匹配到特化上的, 却匹配到实例化上) (偏特化可以被二阶段查找, 但是如果指定了特化, 二阶段查找会被提前. 导致问题)
- 类中也有声明顺序的问题(类方法)
- 模板匹配问题: 字符串数组 和 字符指针 隐式转换引发的二义性
- 12-测试反射
- 编译期获取成员个数细节
- 实现魔法枚举: 支持无宏的, 从枚举反射到字符串和字符串转枚举 & 在线跨平台测试(非最新代码), 目前实现是C++20的, 可以轻易下凡到 C++17 (C++17 以下的不行, 因为需要编译器提供的宏)
- 实现反射: 从类型反射到字符串(不包含模板) (C++17) &
- 13-宏魔法学习
(图灵完备的哦) - 14-临时测试
- 15-如何在模板形参中使用字符串
- std的剖析! (包含一些stl源码的实现)
-
QT
- 01-QML QML-目录 | 笔记: 现代C++QT-QML
-
OpenGL 图形学
-
OS & 平台API
特别的, 下面为实验性质, 存在已知Bug, 并且未修复! 正确实现可以看 https://github.com/HengXin666/HXLibs
- 01-io_uring
- 基于协程的io_uring简易框架(目前是一个 带超时 的
cin示例)- WhenAny 协程
- UninitializedNonVoidVariant (擦除
void类型的类型可重复的共用体) (也算的06的内容...)// @todo 支持从可构造的进行构造, 而不是一定要类型一样 (std::string <- const char *)
- 基于协程的io_uring简易框架(目前是一个 带超时 的
- 02-thread
- 线程池 一个现代的线程池, 支持动态扩容和返回值 (基于C++ STL API)
- 03-iocp
- 基于协程的IOCP简易框架 支持超时机制!
- 01-io_uring
-
赤石C++
- 01-实现一个
<-左指针运算符 - 02-解决循环依赖无法使用引用的问题 (通过模板二阶段名称查找)
- 03-[赤石QML] Wayland 窗口系统, 如何实现记忆窗口位置
- FullScreenWindow.qml (外部链接, 可能会失效)
- 01-实现一个
-
第三方库