要应用于输入的转换链的设计模式
Design pattern for chain of transformations to be applied to input
我正在开发一个应用程序,在这个应用程序中,我遇到了一个常见的问题,即获取某种类型的输入,并对其应用一系列转换以获得输出。
例如,我以cv::Mat
形式的图像作为输入,对其应用函子以获得一组std::vector<Eigen::VectorXf>
形式的局部特征,然后将其转换为单个Eigen::VectorXf
形式的全局描述符。这只是一个例子,实际的处理链可能要长得多。
我正试图想出一个合理的方式来表达这一点。我目前正在考虑一种操作的链表,其中每个操作调用下一个操作,除非其next
字段为空。
这是明智的前进方式吗?有没有针对这种情况的设计模式?
是。设计模式被称为"责任链",根据您将如何实现它,您提到的关于使用链表的内容是完全有效的。试着在谷歌上搜索它以更好地了解它。
[我不确定这是否适用于您,但这在评论中有点太多了。]
C++中链接操作的一种常见方式是实际链接调用,类似于从流读取/写入流时输入/输出运算符的链接方式。
假设你有一个对象O
,你可以对它执行操作a
、b
和c
。然后你可以设计操作(函数)来返回对this
(即return *this
)的引用,你可以将调用链接在一起作为
O.c().a().b();
这是关于如何在C++中链接操作(函数调用)的一般解释。对于您的情况,您可能需要将数据封装在一个类中,该类充当实际操作的简单单层代理。
你可以这样做(只是示例代码,与你的代码无关):
class integer_ops
{
public:
integer_ops(int start_value = 0) : value(start_value)
{ }
integer_ops& add(const int v)
{
value += v;
return *this;
}
integer_ops& sub(const int v)
{
value -= v;
return *this;
}
integer_ops& mul(const int v)
{
value *= v;
return *this;
}
integer_ops& div(const int v)
{
value /= v;
return *this;
}
int value() const
{
return value;
}
private:
int value;
};
上面的类包装了一个int
值和简单的算术运算。它可以用作:
int result = integer_ops(5).mul(2).add(10).div(2).sub(2).value();
上述代码将等于
int result = (((((5) * 2) + 10) / 2) - 2);
其中在这两种情况下都向CCD_ 12分配整数值CCD_。
我希望你能理解一般原则,并能想出如何将其应用于你的案件。
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 资源管理设计模式
- 用于在回调中调用解析器的设计模式
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 在这种情况下我应该使用哪种设计模式
- C++中物体改变识别的设计模式?
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 设计模式,以避免不必要地添加抽象函数以适应新功能
- 工厂设计模式优化
- 使用C++模板的数据映射器设计模式
- 为什么以及如何使用原型设计模式
- 具有多个继承共享一个资源的对象 - 寻找良好的设计模式
- 在C++中创建观察器设计模式的好方法
- 现代C++在多大程度上消除了对设计模式的需求?
- 对于存储另一个类所需信息的类,例如其构造,是否有设计模式?
- C++ 设计模式,以避免复制和向下转换
- 要应用于输入的转换链的设计模式
- 设计模式以避免消息传递中的下转换
- 多态数据转换/转换设计模式