news 2026/8/5 22:33:31

如何使用MPark.Patterns?从FizzBuzz示例快速入门C++模式匹配

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何使用MPark.Patterns?从FizzBuzz示例快速入门C++模式匹配

如何使用MPark.Patterns?从FizzBuzz示例快速入门C++模式匹配

【免费下载链接】patternsThis is an experimental library that has evolved to P2688项目地址: https://gitcode.com/gh_mirrors/patterns2/patterns

MPark.Patterns是一个实验性C++库,它为C++开发者提供了强大的模式匹配功能,已演变为P2688标准提案。本文将通过经典的FizzBuzz问题,带您快速掌握MPark.Patterns的核心用法,让您的C++代码更简洁、更具可读性。

📋 什么是MPark.Patterns?

MPark.Patterns是一个基于C++17及以上标准的模式匹配库,它允许开发者使用类似函数式编程语言的模式匹配语法来处理数据。该库的核心头文件位于include/mpark/patterns/match.hpp,通过引入这个头文件,您可以在C++代码中使用丰富的模式匹配功能。

🚀 快速开始:安装与配置

要开始使用MPark.Patterns,首先需要克隆项目仓库:

git clone https://gitcode.com/gh_mirrors/patterns2/patterns

项目使用CMake进行构建,您可以按照标准的CMake项目构建流程进行编译和安装。

💡 FizzBuzz问题的模式匹配实现

FizzBuzz是一个经典的编程问题,要求从1到100打印数字,如果数字能被3整除则打印"fizz",能被5整除则打印"buzz",如果同时能被3和5整除则打印"fizzbuzz"。下面我们看看如何使用MPark.Patterns来实现这个问题。

版本一:基础元组模式匹配

MPark.Patterns提供了简洁的元组模式匹配语法。以下是使用元组模式匹配实现FizzBuzz的代码:

auto fizzbuzz_v1() { std::vector<std::variant<int, std::string>> result; using namespace mpark::patterns; for (int i = 1; i <= 100; ++i) { match(i % 3, i % 5)( pattern(0, 0) = [&] { result.push_back("fizzbuzz"); }, pattern(0, _) = [&] { result.push_back("fizz"); }, pattern(_, 0) = [&] { result.push_back("buzz"); }, pattern(_, _) = [&] { result.push_back(i); } ); } return result; }

在这个实现中,我们使用match(i % 3, i % 5)来匹配两个值的组合。pattern(0, 0)表示当两个值都为0时的情况(即能被15整除),pattern(0, _)表示第一个值为0而第二个值为任意值的情况(即能被3整除但不能被5整除),依此类推。_是通配符,表示匹配任意值。

版本二:使用when条件的模式匹配

MPark.Patterns还支持使用when子句来添加条件判断,使模式匹配更加灵活。以下是使用when条件实现FizzBuzz的代码:

auto fizzbuzz_v2() { std::vector<std::variant<int, std::string>> result; using namespace mpark::patterns; for (int i = 1; i <= 100; ++i) { IDENTIFIERS(x); match(i)( pattern(_).when(_ % 15 == 0) = [&] { result.push_back("fizzbuzz"); }, pattern(arg).when(arg % 3 == 0) = & { result.push_back("fizz"); }, pattern(x).when(x % 5 == 0) = & { result.push_back("buzz"); }, pattern(x) = & { result.push_back(x); } ); } return result; }

在这个实现中,我们使用match(i)来匹配单个值,并使用when子句来添加额外的条件判断。pattern(_).when(_ % 15 == 0)表示当值能被15整除时的情况,pattern(arg).when(arg % 3 == 0)表示当值能被3整除时的情况,其中arg是一个占位符,可以在后续的 lambda 表达式中使用。

📚 深入了解:其他模式匹配功能

除了FizzBuzz示例中展示的基本功能外,MPark.Patterns还提供了许多其他强大的模式匹配功能,如递归模式匹配、变体类型匹配等。以下是一些示例:

递归模式匹配:阶乘计算

int factorial(int n) { using namespace mpark::patterns; return match(n)( pattern(0) = [] { return 1; }, pattern(arg) = [](int n) { return n * factorial(n - 1); } ); }

变体类型匹配:斐波那契数列

int fib_v2(int n) { using namespace mpark::patterns; return match(n)( pattern(arg).when(arg < 0) = [](int) { return 0; }, pattern(arg(anyof(0, 1))) = [](int n) { return n; }, pattern(arg) = [](int n) { return fib_v2(n - 1) + fib_v2(n - 2); } ); }

在这个示例中,我们使用了anyof模式来匹配0或1的情况,使代码更加简洁。

🧪 测试与验证

MPark.Patterns项目提供了完善的测试用例,您可以在test/intro.cpp文件中找到本文介绍的所有示例的测试代码。通过运行这些测试,您可以验证模式匹配的正确性。

TEST(Intro, Fizzbuzz) { EXPECT_EQ(fizzbuzz_v1(), fizzbuzz_v2()); } TEST(Intro, Factorial) { EXPECT_EQ(120, factorial(5)); EXPECT_EQ(3628800, factorial(10)); } TEST(Intro, Fibonacci) { EXPECT_EQ(55, fib_v0(10)); EXPECT_EQ(55, fib_v1(10)); EXPECT_EQ(55, fib_v2(10)); }

🎯 总结

MPark.Patterns为C++开发者提供了强大而简洁的模式匹配功能,通过本文的FizzBuzz示例,您已经了解了该库的基本用法。无论是处理简单的条件判断,还是复杂的递归结构,MPark.Patterns都能帮助您编写更清晰、更易维护的C++代码。

希望本文能帮助您快速入门MPark.Patterns,开始在您的C++项目中体验模式匹配的魅力!如果您想了解更多细节,可以查阅项目的头文件和测试代码,深入探索这个强大库的更多功能。

【免费下载链接】patternsThis is an experimental library that has evolved to P2688项目地址: https://gitcode.com/gh_mirrors/patterns2/patterns

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/5 22:29:08

HumanoidBench机器人模型详解:H1、G1与Shadow Hand的传感器与控制模式

HumanoidBench机器人模型详解&#xff1a;H1、G1与Shadow Hand的传感器与控制模式 【免费下载链接】humanoid-bench 项目地址: https://gitcode.com/gh_mirrors/hu/humanoid-bench HumanoidBench是一个功能强大的机器人仿真平台&#xff0c;提供了多种先进的机器人模型…

作者头像 李华
网站建设 2026/8/5 22:28:51

Selenium WebDriver核心原理与浏览器配置实战指南

1. 项目概述&#xff1a;从“会写”到“懂原理”的跨越如果你已经跟着前面的教程&#xff0c;用Selenium写了几行代码&#xff0c;让浏览器自动打开网页、点击按钮&#xff0c;可能会觉得UI自动化“不过如此”。但当你真正想把脚本放到服务器上跑&#xff0c;或者需要处理更复杂…

作者头像 李华
网站建设 2026/8/5 22:24:55

STM32外部中断实战:从轮询到中断的按键处理优化与避坑指南

1. 项目概述&#xff1a;从轮询到中断&#xff0c;按键处理的效率革命 搞嵌入式开发&#xff0c;特别是用STM32、GD32这类MCU的朋友&#xff0c;对“按键检测”这个基础功能肯定不陌生。最开始学的时候&#xff0c;大多数人都是从 while(1) 循环里加个 if(GPIO_ReadInputDat…

作者头像 李华
网站建设 2026/8/5 22:24:53

CSDN Markdown图片插入全攻略:从语法到图床,打造稳定图文内容

1. 从“图床依赖”到“本地化掌控”&#xff1a;为什么图片管理是Markdown写作的命门如果你在CSDN、知乎、掘金这类技术社区写过文章&#xff0c;大概率遇到过这个场景&#xff1a;你精心准备了一篇图文并茂的教程&#xff0c;本地预览一切完美&#xff0c;信心满满地复制粘贴到…

作者头像 李华
网站建设 2026/8/5 22:24:08

AI做微博运营,这4类账号正在被淘汰(含3家已关停的真实品牌案例)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI做微博运营 AI正深度重构微博内容生产、分发与互动的全流程。借助大语言模型与多模态能力&#xff0c;运营者可实现从选题策划、文案生成、配图建议到发布时间优化的自动化闭环&#xff0c;显著提升传…

作者头像 李华
网站建设 2026/8/5 22:22:21

WebVR交互设计实战:WebVR Experiments中的按钮与用户界面开发

WebVR交互设计实战&#xff1a;WebVR Experiments中的按钮与用户界面开发 【免费下载链接】webvr-experiments A collection of React VR & A-Frame experiments 项目地址: https://gitcode.com/gh_mirrors/we/webvr-experiments WebVR Experiments是一个包含React …

作者头像 李华