之前在 V2EX 发过 Patternia 的初版介绍,经过多个月的迭代,目前已发布 v0.9.0 ,整理一下当前状态。
Patternia 是一个 header-only 的 C++17 模式匹配库,目标是为 C++ 提供结构化的条件分支与数据解构能力,替代分散的 if/switch 与手动类型判别。零运行时开销,不依赖 RTTI 和虚函数。
相较上次发帖时的状态,v0.9.0 的主要进展:
- 补全了
std::variant的类型分发,通过is<T>/as<T>匹配 - 引入了
PTN_WHERE和PTN_LET命名守卫语法,替代手写 lambda 做谓词约束 - 清理了早期遗留 API ( bind()、_1/_2/_3 、type:: 命名空间等)
- 修复了 MSVC 下 callable guard 的编译器兼容问题
- 已添加至
vcpkg官方源
#include <ptn/patternia.hpp> using namespace ptn; // 值守卫 const char *bucket(int x) { return match(x) | on( $[PTN_LET(value, value < 0)] >> "negative", $[PTN_LET(value, value < 10)] >> "small", _ >> "large" ); } // 结构解构 + 命名守卫 struct Point { int x; int y; }; bool on_diagonal(const Point &p) { return match(p) | on( $(has<&Point::x, &Point::y>())[PTN_WHERE((x, y), x == y)] >> true, _ >> false ); } 后续计划包括穷尽性检查与编译期诊断的完善。欢迎 issue 、反馈和设计层面的讨论。
