焦小花同学

pattern_matching:模式匹配实现,数据处理的优雅之选

Image

等你来关注!

pattern_matching:模式匹配实现,数据处理的优雅之选

C++ 写代码的时候,遇到条件判断多的场景,心情是不是有点像赶早高峰挤公交车?if、else if、else 一长串,看着就让人头大。要是能用优雅的模式匹配,就能让代码更清爽、更易读。今天就聊聊怎么在 C++ 里撸一个简单的模式匹配库,写起来轻松,读起来舒服。

模式匹配的概念

Image

模式匹配的核心思想是:根据数据的具体模式,选择对应的处理逻辑。就像餐馆点菜,你点个“宫保鸡丁”,厨师知道要炒鸡丁,点个“番茄炒蛋”,他马上换个锅炒番茄和鸡蛋。每种模式(菜名)对应一种处理方式(菜谱)。

在 C++ 中,我们可以通过模板和函数来实现类似的功能。简单点说,就是用模板把模式和逻辑绑定起来,再通过函数调用自动匹配模式。

实现一个简单的模式匹配工具

Image

下面用代码来展示个小工具的雏形。先定义个 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 方法处理未匹配的情况。

实际应用场景

Image

假设咱们写个小程序,根据数字判断天气类型:

  • 数字 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 干净多了?

温馨提示

Image

  1. 注意数据类型匹配 :Case 里的模式值类型要和输入数据类型一致,不然会出问题。

  2. 不要漏了Default:万一所有模式都没匹配上,Default 可以兜底,避免莫名其妙的逻辑漏洞。

  3. 灵活扩展 :这个工具还能搭配 std::variant 或 std::optional,处理更复杂的数据类型。

结尾随便扯两句 。模式匹配的好处就是让代码更直观、更易读,尤其是数据处理场景下,简直不要太香。写代码嘛,清爽点总是好事。

E

N

D

Image

Image

往期回顾

Image

perfect_forwarding:完美转发工具,通用代码的设计范本

PhysX:NVIDIA的物理引擎,游戏开发的必杀技

Image

分享

Image

收藏

Image

在看

Image

点赞