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

C++ 应用于输入的转换链的设计模式,c++,design-patterns,C++,Design Patterns,我正在开发一个应用程序,其中有一个常见的问题,就是获取某种类型的输入并对其应用一系列转换以获得输出 例如,我将cv::Mat形式的图像作为输入,对其应用函子以获得std::vector形式的一组局部特征,然后将其转换为单个特征::VectorXf形式的全局描述符。这只是一个例子,实际的处理链可能要长得多 我正试图想出一个合理的方式来表达这一点。我目前正在考虑一种操作链表,其中每个操作调用下一个操作,除非其下一个字段为空 这是明智的前进方式吗?有针对这种情况的设计模式吗?有。设计模式称为责任链,这

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

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

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


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

有。设计模式称为责任链,这取决于您将如何实现它,您提到的使用链表是完全有效的。试着用谷歌搜索一下,以便更好地了解它。

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

< > C++中链接操作的一种常见方式是实际链接调用,类似于如何从输入/写入到流中时如何链接输入/输出操作符。 假设您有一个对象O,可以对其执行操作a、b和c。然后,您可以设计操作函数来返回对此的引用,即返回*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);
在这两种情况下,结果都被赋予整数值8


我希望您理解一般原则,并能找出如何将其应用于您的案例。

谢谢您的时间,Joachim。这种方法可以很好地用于更简单的操作,但在大多数情况下,要应用的转换相当大,并且彼此之间非常不相交。把他们都安置在同一个班级似乎太过分了。