C ++在运行时构建嵌套函数

时间:2018-04-28 11:29:12

标签: c++

所以我正在学习C ++,而我正试图找出一种基于运行时接收的输入构建一系列函数的方法。基本的想法是我计划有一个函数来创建一个能力,它可以由几个动作构成,它可以有几个形状,可以有几种效果。我计划出来的代码(没有正确拆分函数或实际编写代码)的结构如下:

//Planned function:
/*
Ability()
{
  Action 1()
  {
    Type of action
    Shape 1 of Action 1()
    {   
      Type of shape
      Effect 1 of Shape 1 of Action 1()
      {
        Type of effect
      }
      Any more effects?
    }   
    Any more shapes?
  }
Any more actions?
}
/**/

但我不太确定如何根据用户输入积极构建这样的嵌套函数集,存储它,并将其用作稍后在运行时运行而不必重建它的东西。

我很抱歉,如果我只是遗漏了一些明显的东西,我还没有真正得到过去的对象类。

1 个答案:

答案 0 :(得分:0)

  

我会根据用户输入积极构建这样的嵌套函数集,存储它,并将其用作稍后在运行时运行而不必重建它的东西。

基本上,你需要的是保存一组稍后要调用的操作。在软件工程中,这称为Command pattern。简而言之,每个操作(命令,动作,函数......)被建模为一个对象,其中包含执行操作所需的所有信息以及触发(执行,执行,运行...)它的方法。通常,这些对象符合相同的界面,因此您可以多态地触发它们。

在C ++中,一个简单的命令可能如下所示:

class Command
{
    int state_;

public:
    explicit Command(int state) : state_(state) {}

    void operator()() {
        // do something with your state
    }
};

然后您可以存储命令列表:

std::vector<Command> commands;

commands.push_back(Command(1));
commands.push_back(Command(2));
// ...

后来运行它们:

for (auto & c : commands)
    c();

通常,您需要使用不同类型的命令,因此Command将是一个抽象类,然后您将派生出几个代表不同操作的不同类。

然后,为了像你说的那样“嵌套”函数(即为了编写命令),你可以简单地将Command存储在其他Command中。

当然,这是针对该问题的OOP方法 - 您可以始终将其展平并编写一个等效算法,该算法读取包含所有必需参数的某些数据结构,并根据它们在每个步骤执行相应的操作;而不是将它传播到不同的班级。

最后,还有一个注意事项:在C ++中有很多东西可以调用/调用Callable):函数,函数对象(如上所示),指向成员函数的指针,lambda表达式...如果你想要进入OOP路线并且完全通用,你可以轻松利用std::function(或类似的实现,如boost::function用于预C ++ 11),是一个通用的多态包装器,可以存储其中任何一个。