【发布时间】:2017-10-09 23:58:40
【问题描述】:
我正在尝试构建一个 C++ 数据结构来建模一个简单的 N 阶段过程,其中每个阶段都可以用不同的函数替换。一种方法是使用 OO 方法,并为每个阶段创建一个带有虚拟方法的抽象基类;例如:
class Pipeline {
protected:
virtual void processA(const In& in, BType& B) = 0;
virtual void processB(const BType& B, BType& C) = 0;
virtual void processC(const CType& C, BType& D) = 0;
virtual void processD(const DType& D, Out& out) = 0;
public:
void process(const In& in, Out& out) {
Btype B;
processA(in, B);
Ctype C;
processB(B, C);
Btype D;
processC(C, D);
processD(D,out);
}
};
这种方法的问题是,如果 N 个阶段中的每一个都可以与 M 个进程互换,那么你就有 N*M 个可能的子类。
另一种思路是存储函数对象:
class Pipeline {
public:
std::function<void(const In& in, BType& B)> processA;
std::function<void(const In& B, CType& C)> processB;
std::function<void(const In& C, DType& D)> processC;
std::function<void(const In& D, Out& out)> processD;
void process(const In& in, Out& out) {
Btype B;
processA(in, B);
Ctype C;
processB(B, C);
Btype D;
processC(C, D);
processD(D,out);
}
};
我在使用这种方法时遇到的问题是这些阶段并不是真正独立的,在某些情况下,我希望一个对象来存储有关多个阶段的信息。
有没有人为带有可更换部件的管道找到一个好的数据结构?奖金将能够允许每个阶段同时运行。
【问题讨论】:
-
快速浏览一下,它似乎被设计破坏了。你不能为管道组件制作一个标准化的容器并将它们打包成
std::vector之类的东西吗?这段代码对性能有多敏感?对其进行迭代可能就足够了,但如果您需要绝对速度,您可能需要求助于代码生成器或一些非常密集的模板工作。 -
您能否举例说明假设您有一个完美的实现,您将如何使用该代码?
Pipeline p{a2b, b2c, c2d}; bunch_of_ds = p.run(bunch_of_as);最终会是这个样子吗? -
@tadman 我正在处理的实际应用程序涉及一个相当复杂的图像处理管道。我希望能够交换阶段并在每个阶段尝试各种不同的算法。在某些情况下,某些阶段将在 GPU 上运行,并且可能涉及在主机和设备之间复制内存。我不想使用向量,因为每个元素都是不同的类型(即具有不同参数的不同函数)——将它们包装在结构/类中是最有意义的。
-
@nwp 每个阶段都可以有一些相当大的专业输出(例如,图像金字塔),并且数据结构需要被重用。您是在暗示我应该将输入和输出包装到一个结构中吗?这似乎并没有明显改变问题。
-
@nwp 我明白了。实际上,我希望在我的案例中重用输出数据结构,因为它们很大,并且我想尽可能避免重新分配。
标签: c++ data-structures