败犬日报 2025-05-19
1. C++ 中文周刊 2025-05-19 第183期
https://wanghenshui.github.io/cppweeklynews/posts/183.html
2. 代码鉴赏:文件拆成两半
cpp
#include "foo_head.h" // void foo() {
bar();
#include "foo_tail.h" // }
逆天代码,不仅可读性差,clangd / format 工具也寄了。
正确做法:定义宏再 include:
cpp
#define CONTENT bar();
#include "foo.h" // void foo() { CONTENT; }
另一种是定义头尾宏:
cpp
#define FOO_HEAD void foo() {
#define FOO_TAIL }
FOO_HEAD
bar();
FOO_TAIL
3. enum class 有些 kUnknown 写在最前面,有些在最后面
有的地方写在后面并且用 for i < kUnknown
来遍历。
好一点的实践是 kUnknown 放前面(因为默认值是最前面的值),最后放个 count 用来遍历。
激进一点可以上 enum 反射库,例如 https://github.com/Neargye/magic_enum。
什么时候要遍历 enum,比如有 10 个 engine,弄了个 1-10 的 enum 当 id 用。现在想把所有 engine id 注册到某个地方,要么 for 一遍 enum 要么手写 10 个注册。
4. C++17 实现无参数的 lambda template
C++20 才有 lambda template:
cpp
auto lambda = []<typename T>() {
// use T
};
lambda.operator()<int>(); // 更新:原来的 lambda<int>(); 会编译错误
lambda.operator()<float>(); // 更新:原来的 lambda<float>(); 会编译错误
可以手写 std::type_identity(这个也是 C++20 的,但可以自己搓):
cpp
auto lambda = [](auto T) {
// use decltype(T)::type
};
5. Python 3.14 尾调用解释器性能分析(文章)
https://blog.nelhage.com/post/cpython-tail-call/
CPython 3.14 的新尾调用解释器最初显示出 10-15% 的性能提升,该提升主要源于修复了 LLVM 19 的一个回归问题。