使用纤程简化枚举器2:对调用者友好的一种实现
在上一篇文章中,我们演示了一个枚举器的实现者(生产者)如何编写代码来实现一个目录树结构的枚举。在今天的文章中,我们来看看从消费者的角度如何实现一个简单的枚举器,直接看下图:
在这个设计下,枚举器会循环输出文件,调用者可以告诉枚举器,何时移动到下一个,也可以指示枚举器跳过某个目录。
值得注意的是,上述代码中,并没有定义FER_STOP。 如果消费者想要停止枚举,它只需要停止调用Next()。
通过这种设计,我们计算每个目录的大小的测试函数将会非常简单,如下图所示:
当然,这种设计将所有工作都放在了枚举器上。 调用者不是让生产者遍历树并在找到内容时调用回调,而是调用者自己反复调用 Next(),每次枚举器都必须找到下一个文件并返回它。 由于枚举器返回,它不能将其状态存储在调用堆栈中; 相反,它必须使用堆栈数据结构来手动模拟调用堆栈。
下面我们来看看枚举器代码的实现,看起来会有些复杂:
正如你所看到的,简单的递归函数变成了上图中的可怕的状态机管理。
如果我们可以两者兼得,那不是很好吗? 调用者会看到一个简单的枚举器,它会吐出文件(或目录)。 但是枚举器会接收一个回调,它可以将文件放入其中。
我们后面会进行改造改造,让世界变得更美好一些。
总结
我就想编写简单的代码,可不可以。
可以,但你需要明白:总有人替你负重前行。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Using fibers to simplify enumerators, part 2: When life is easier for the caller》
最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
- 下一篇: 使用纤程简化枚举器3:两方面都兼顾
- 上一篇: 使用纤程简化枚举器1:枚举器的简单实现
相关推荐
- 显示字符串如何避免出现方框
- Posted on 07月21日
- C++20特性观摩:Conditionally Trivial Special Member Functions
- Posted on 11月24日
- 实战经验:使用letsencrypt生成用于IIS的HTTPS证书
- Posted on 01月08日
- 实战经验:FTP服务器搭建出现Entering Passive Mode问题
- Posted on 11月06日
评论已关闭。