我正在开发一个应用程序,我有一个常见的问题,即输入某种类型并对其应用一系列转换以获得输出。
例如,我以cv::Mat
的形式拍摄图像作为输入,将一个仿函数应用于它以获得std::vector<Eigen::VectorXf>
形式的一堆局部特征,然后转换为全局描述符以单Eigen::VectorXf
的形式出现。这只是一个例子,实际的处理链可能要长得多。
我正试图想出一种明智的方式来代表这一点。我目前正在考虑一种链接的操作列表,其中每个操作调用下一个操作,除非其next
字段为空。
这是明智的前进方式吗?是否存在适用于这种情况的设计模式?
答案 0 :(得分:0)
是。设计模式称为“责任链”,具体取决于您如何实现它,您提到的使用链表的内容完全有效。尝试谷歌搜索它以更好地了解它。
答案 1 :(得分:0)
[我不确定这是否适用于你,但在评论中写一点是太多了。]
在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);
在两种情况下都为result
分配了整数值8
。
我希望你理解一般原则,并且可以弄清楚如何将它应用到你的案例中。