败犬日报 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. 阅读资料
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 比 !
更加显眼,只是这么写的人很少。