Skip to content

败犬日报 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 的一个回归问题。