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

C++ building nesting functions during runtime

本文关键字:函数 嵌套 构建 运行时 C++      更新时间:2023-10-16

所以我正在学习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?
}
/**/

但是我不太确定我会怎么做才能根据用户输入主动构建一组这样的嵌套函数,存储它,并将其用作我可以稍后在运行时运行而无需重建它的东西。

很抱歉,如果我只是错过了一些明显的东西,我还没有真正通过对象类。

我会

如何根据用户输入主动构建一组嵌套的函数,存储它,并将其用作稍后可以在运行时运行的东西,而无需重建它。

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

在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 for pre-C++11(,这是一个通用的多态包装器,可以存储其中任何一个。