最优雅的方式来实现管道和过滤模式

时间:2013-05-11 23:57:32

标签: c++ design-patterns c++11 functional-programming

我想创建一个基于管道和过滤器的数据处理程序,它应该像这样处理传入的数据集,但不一定限于:

源管道(可以是来自数据库的数据集)< -sink-source->过滤(添加一个额外的字段)< -sink-source->过滤(操纵一些更多的数据/删除即使数据集无效)

我知道这样的架构在C / C ++中会是什么样子。但考虑到C ++ 11功能方面的所有好处,我希望这项任务能够以优雅的方式完成,以便能够:

  • 可以在多线程环境中轻松扩展和使用它(例如,通过执行过滤任务作为lambda函数,因此可能至少避免一些线程处理)
  • 在运行时轻松添加和删除过滤器
  • 懒洋洋地处理输入流

2 个答案:

答案 0 :(得分:7)

即将推出的C ++ 14标准中有一个草案涵盖了这一领域:

C++ Pipelines - ISO/IEC JTC1 SC22 WG21 N3534 = 2013-03-15

这是一个实现:

code.google.com/p/google-concurrency-library/source/browse/include/pipeline.h

答案 1 :(得分:3)

您所描述的是某种流式架构管道架构。标准C ++没有这个特定的东西,但作为库作者,它为您提供了语言和标准库中必要的原语,以构建这样的体系结构。只需按照通常的面向对象编程创建类和接口,然后实例化它们并根据需要将它们连接到管道中。

例如,您可能有Source接口和Sink接口 - 以及同时实现FilterSource的{​​{1}}抽象类作为实现SinkPipe的{​​{1}}类,只是直接传递数据。这只是命名和组织这样一个框架的众多方法之一。