pattern_matching:模式匹配实现,数据处理的优雅之选
等你来关注!
pattern_matching:模式匹配实现,数据处理的优雅之选
C++ 写代码的时候,遇到条件判断多的场景,心情是不是有点像赶早高峰挤公交车?if、else if、else 一长串,看着就让人头大。要是能用优雅的模式匹配,就能让代码更清爽、更易读。今天就聊聊怎么在 C++ 里撸一个简单的模式匹配库,写起来轻松,读起来舒服。
模式匹配的概念
模式匹配的核心思想是:根据数据的具体模式,选择对应的处理逻辑。就像餐馆点菜,你点个“宫保鸡丁”,厨师知道要炒鸡丁,点个“番茄炒蛋”,他马上换个锅炒番茄和鸡蛋。每种模式(菜名)对应一种处理方式(菜谱)。
在 C++ 中,我们可以通过模板和函数来实现类似的功能。简单点说,就是用模板把模式和逻辑绑定起来,再通过函数调用自动匹配模式。
实现一个简单的模式匹配工具
下面用代码来展示个小工具的雏形。先定义个 Match 类,支持不同模式和对应动作。
#include <iostream>
#include <functional>
#include <variant>
template <typename T>
class Match {
public:
Match(T value) :value_(value) {}
template <typename Pattern, typename Func>
Match& Case(Pattern pattern, Func func) {
if (!matched_ && value_ == pattern) {
func();
matched_ = true;
}
return *this;
}
template <typename Func>
Match& Default(Func func) {
if (!matched_) {
func();
}
return *this;
}
private:
T value_;
bool matched_ = false;
};
这个工具支持用 Case 方法匹配模式,用 Default 方法处理未匹配的情况。
实际应用场景
假设咱们写个小程序,根据数字判断天气类型:
数字 1:晴天
数字 2:雨天
数字 3:阴天
其他:未知天气
用这个 Match 工具改写代码,简直不要太优雅!
int main() {
int weatherCode = 2;
Match(weatherCode)
.Case(1, []() { std::cout << “晴天\n”;})
.Case(2, []() { std::cout << “雨天\n”;})
.Case(3, []() { std::cout << “阴天\n”;})
.Default([]() { std::cout << “未知天气\n”;});
return 0;
}
运行结果是:
雨天
是不是比 if-else 干净多了?
温馨提示
注意数据类型匹配 :
Case里的模式值类型要和输入数据类型一致,不然会出问题。不要漏了
Default:万一所有模式都没匹配上,Default可以兜底,避免莫名其妙的逻辑漏洞。灵活扩展 :这个工具还能搭配
std::variant或std::optional,处理更复杂的数据类型。
结尾随便扯两句 。模式匹配的好处就是让代码更直观、更易读,尤其是数据处理场景下,简直不要太香。写代码嘛,清爽点总是好事。
E
N
D
往期回顾
分享
收藏
在看
点赞