Skip to content

败犬日报 2024-11-17

1. 状态模板元编程 STMP

1.1. STMP 是什么

状态模板元编程,模板不再是个常量表达式。一个简单的例子是计数器,效果如下:

cpp
constexpr auto a = next();
constexpr auto b = next();
constexpr auto c = next();
static_assert(a == 0 && b == 1 && c == 2);

1.4. 有用吗

看一乐就好,加深一下对模板的认识,不要真的写这样的代码。

这种代码十分依赖于模板实例化的位置,非常容易造成 ODR 违背,并且多次重复实例化会大大增长编译时间。

1.2. 阅读资料

C++ 禁忌黑魔法:STMP (上)

C++ 禁忌黑魔法:STMP (下)

1.3. 是缺陷吗

还没确定是缺陷,可能以后也不是。

已经在反射提案里提及。

cwg issue 和反射提案肯定要死一个,蹲结果就行。

1.5. 替代品

代码生成:用程序生成 C/C++ 代码,已有大量实践,如 protobuf。

静态反射:还需要等,未来可能进标准。

1.6. 二分实现计数器

贴代码:https://paste.ubuntu.com/p/CHXpf5mVfw/

2. C++ and or not

https://zh.cppreference.com/w/cpp/language/operator_alternative

规定了 and 和 && 等价,但不是宏。

根据这点可以写出 auto and x = 1; 这样的代码(等同 auto&& x = 1;)。

设计初衷是方便其他语言使用者写 C++ 时可以直接用(比如 Python 的 and or not)。

有个好处是 not 比 ! 更加显眼,只是这么写的人很少。