有没有一种方法可以将方法存储在c ++中的某种类型的向量中?

时间:2020-03-01 17:16:52

标签: c++ image vector chaining juce

这是我第一次来这里。

我目前正在尝试通过遍历所有像素并对那里的颜色做些事情来编写用于图像后处理的类。

我的想法是添加诸如posterize()rgbSplit()之类的方法。初始化它们时,每种效果都不会遍历所有像素,因为效果不是很好。我希望它存储这样一个事实,即当我使用称为process()的方法时,它应在给定链中处理这些影响。

但是,因此我必须将对效果代码的引用存储在一个列表中(例如矢量),对吗?因为这样我可以进入x和y坐标的for循环,并在其中添加另一个for循环,该循环遍历了应该应用于像素的所有方法。

问题是,我不知道如何将方法存储在向量中。那有可能吗?还是矢量仅用于对象?还是我可以以某种方式“客观化”一种方法?还是我现在要做的是什么?

4 个答案:

答案 0 :(得分:5)

这个问题非常广泛。但是我知道您才刚刚起步,需要在编写一些代码之前先知道是否有可能。

因此,这里是一个简短的底层答案:

  • 是的,您可以拥有StreamWriter的向量;
  • 是的,您可以拥有function pointers的向量,它比原始函数指针更强大,更灵活。
  • 是的,您可以通过将方法作为虚拟函数放在类中并像使用函数一样使用它来“对象化”(使用方法名称并实现std::function或使用{{1} }来实现经典的command pattern)。
  • 是的,您甚至可以通过将数组替换为functor的变体来更灵活地链接不同的栅格操作

但是在更高的层次上,您需要更好地考虑您的设计:

  • 某些图像滤镜可以在像素级别工作,然后您的方法就可以了
  • 但是某些图像过滤器可对一组相邻像素起作用。如果您要逐个像素工作,则链接将无法正常工作,因为在处理的组中将存在已变换的像素和仍未变换的原始像素。

因此,您的设计需要同时处理两种算法。例如,您可以首先将链中的初步像素变换应用于所有像素,然后仅在已变换像素的组上运行算法,然后在链中继续进行。

此外,正如chain of responsibility pattern在评论中指出的那样,另一个问题是,从性能的角度来看,逐个调用算法是否有意义。链接算法也许是个好主意,但是在图像转换级别而不是像素级别。

一旦您考虑了这一点,并开始使用上述想法之一实施解决方案,您可能会回到这里提出更精确的问题,并用一些代码说明。

答案 1 :(得分:0)

如果要使用观察者模式,则boost :: signals2是一个不错的选择。

观察者模式 https://en.wikipedia.org/wiki/Observer_pattern?wprov=sfla1

boost :: signals2 https://www.boost.org/doc/libs/1_72_0/doc/html/signals2.html

干杯, FM。

答案 2 :(得分:0)

我目前正在关注有关函数指针的cherno教程,因为我认为也许我需要一个详细了解它并且结构极好的人。 https://www.youtube.com/watch?v=p4sDgQ-jao4&t=306s

在5分钟时,他通过说void(* cherno)()= HelloWorld;创建了一个函数指针。

我也尝试这样做,但出现错误。这是我的代码:

import numpy as np

startAddress = int('00D00000', 16)
address = startAddress.to_bytes(8, 'little')
address = np.frombuffer(addressMsg, dtype=np.uint8)
address = address[0:4].reshape(4,1)

它强调了someFunc并且错误提示:

“ void(ImagePP :: )()”类型的值不能用于初始化“ void()()”类型的实体


如果我理解正确,它说我不能这样做,因为我不是在主要的,而是在课堂上做的。但是我该怎么办呢?我想在课堂上使用它

答案 3 :(得分:0)

class ImagePP {
public:
    std::function<void> someFunc(int i) { DBG("someFunc started: " << i); }

    void process() {
        DBG("process Started.");

        typedef std::function<void>(ImagePP::*FuncPtr)(int);
        FuncPtr function = someFunc;
        function(5);
    }
};

这就是我现在得到的。意识到它想要在那里的类名,但是现在即使函数想要一个整数,它也会在(5)下划线。它说:

显式调用括号前的表达式必须具有(指针指向)函数类型

当我使用常规void而不是std :: function时,我有相同的错误