要应用于输入的转换链的设计模式

Design pattern for chain of transformations to be applied to input

本文关键字:设计模式 转换 输入 应用于      更新时间:2023-10-16

我正在开发一个应用程序,在这个应用程序中,我遇到了一个常见的问题,即获取某种类型的输入,并对其应用一系列转换以获得输出。

例如,我以cv::Mat形式的图像作为输入,对其应用函子以获得一组std::vector<Eigen::VectorXf>形式的局部特征,然后将其转换为单个Eigen::VectorXf形式的全局描述符。这只是一个例子,实际的处理链可能要长得多。

我正试图想出一个合理的方式来表达这一点。我目前正在考虑一种操作的链表,其中每个操作调用下一个操作,除非其next字段为空。

这是明智的前进方式吗?有没有针对这种情况的设计模式?

是。设计模式被称为"责任链",根据您将如何实现它,您提到的关于使用链表的内容是完全有效的。试着在谷歌上搜索它以更好地了解它。

[我不确定这是否适用于您,但这在评论中有点太多了。]

C++中链接操作的一种常见方式是实际链接调用,类似于从流读取/写入流时输入/输出运算符的链接方式。

假设你有一个对象O,你可以对它执行操作abc。然后你可以设计操作(函数)来返回对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_。

我希望你能理解一般原则,并能想出如何将其应用于你的案件。