std ::可执行函数列表?

时间:2016-06-04 20:14:13

标签: c++ list function stdlist

我正在尝试编写一个模拟简单系统的程序。用户添加修改信号的块,程序“通过块运行信号”。我想写它,因此它模拟一个真实的系统,我正在研究这个解决方案,但我真的不知道如何做到这一点: 我的信号类中有多个“块”函数,例如:

float sygnal::Wzmocnienie(float p, float q){
        p=p*q;
        return p;
}

这是用于放大的例子。它接受值并通过传递给函数的值放大它。现在我要做的是创建一个函数,首先将正确的函数添加到std :: list,如下所示:

list<float> OpcjeProgramu(list<float> opcje, int argc, char *argv[], sygnal syg){
    double p=0;
    typedef float(sygnal::*funkcja)(float,float);
    funkcja f;
    for(int i=0; i<argc; i++){
        if(strcmp(argv[i],"-G")==0){
                f=&sygnal::Potegowanie;
                opcje.push_back((syg.*f)(syg.u,0));
            }

然后是一个执行两个循环中所有块的函数,如下所示:(rozmiar表示必须修改的数字量)

for(int j=1; j<rozmiar; j+=2){
            u=dane[j];
            for(i=lista.begin(); i!=lista.end(); i++){
                //function to modify signal should be here
            }
        }

我真的不知道如何制作一个函数列表,然后如何调用这些函数 - 我制作了一个浮点列表,并意识到它只返回值,并且在我需要它时不执行函数。

1 个答案:

答案 0 :(得分:0)

您可能希望将块表示为类。这样,您可以轻松地将功能块的输出存储在块本身内,或者如果块的整个输入历史记录更复杂。您还可以将块的输出历史存储在您可能感兴趣的区域内,例如:检查链中途的整个信号。

它还允许您轻松地创建一个列表(或者,如下面的示例中的一个向量),指向派生类实例的基类指针。

类似的东西:

class base {
public:
  struct param { float p, q; };
  virtual void input(param const & p) = 0;
  virtual param const & output() const = 0;
}

class amplify : public base {
public:
  amplify(float const factor_) : factor(factor_) { out.p = out.q = 0.0 }
  void input(param const & p) {
    out.p = p.p * amp;
    out.q = p.q * amp;
  }
  param const & output() const { return out; }
private:
  param out;
  float amp;
}

class system {
public:
  typedef std::vector<base *> blockchain;
  typedef std::vector<base::param> signal;
  void add_block(base * const block) { blocks.push_back(block); }
  void run(signal const & in, signal & out) {
    for(size_t iidx = 0; iidx < in.size(); ++iidx) {
      if(blocks.size() > 0) { blocks[0]->input(in[iidx]); }
      for(size_t bidx = 1; bidx < blocks.size(); ++bidx) {
        blocks[bidx]->input(blocks[bidx-1]->output());
      }
      if(blocks.size() > 0) { out.push_back(blocks[blocks.size()-1]->output(); }
    }
  }
private:
  blockchain blocks;
}