C++ 回调设计模式

C++ 回调设计模式,c++,design-patterns,callback,C++,Design Patterns,Callback,现在,我有一个客户机,它向我的服务器发送一个命令列表,它需要关于这些命令的数据。我的服务器使用getProcAddress通过DLL加载这些命令,例如: InitializeDLL initializeDLL = (InitializeDLL)GetProcAddress(hInstanceLibrary, "InitializeDLL"); 其中,initiailizeDLL定义为: typedef int (CALLBACK* InitializeDLL)(int,int); 客户机现在

现在,我有一个客户机,它向我的服务器发送一个命令列表,它需要关于这些命令的数据。我的服务器使用getProcAddress通过DLL加载这些命令,例如:

InitializeDLL initializeDLL = (InitializeDLL)GetProcAddress(hInstanceLibrary, "InitializeDLL");
其中,initiailizeDLL定义为:

typedef int (CALLBACK* InitializeDLL)(int,int);

客户机现在将命令名作为字符串发送,并希望为其提供数据。我有一系列我希望能够使用的命令,但我不知道如何高效地实现这些命令。我正在考虑创建一个映射,使用名称的字符串作为键,然后使用相应函数的回调*作为指针。但之后我还得投。我主要是java程序员,不是最好的C++程序员,所以我不确定这个地图的想法是否会起作用,或者如何处理最终的转换。此外,我还查看了Wikipedia上的命令模式,但不知道在这种情况下如何实现该模式。

一个映射应该可以做到这一点。将每个字符串映射到函数指针的映射,该函数指针将在接收到特定消息时执行。如果您想使用命令模式,则可以使用类似以下内容: Disclamer,我从很久以前就没有编写C++代码,这个代码可能没有编译):

此模式是命令模式和工厂方法模式的混合。 为每个可能的条目定义从抽象类
Command
继承的命令。现在,您可以使用带有命令的字符串映射,而不是带有函数指针的字符串映射。当您得到一个字符串时,首先调用命令的
CanExecute
,查看该命令是否可以在当前状态下执行。调用
Execute
运行命令,在该命令中调用回调函数。 这是我能想到的封装命令、它们的执行前提条件和它们要执行的实际代码的最好方法


另一方面,这种模式现在在.NET(WPF)中被广泛使用。

使用
map
似乎不是一个坏主意。试一试,如果你面临问题,你可以回来问不同的问题。STL容器的好处在于,只要你
typedef
容器,将一个容器换成另一个容器是相对容易的。所有函数指针都有相同的信号吗?大多数函数指针都是相似的,尽管有一对函数指针返回双精度而不是int,并且参数的数量可能会有所不同。
abstract class Command{
  private:
     string commandName;
     CALLBACK* callBackFunction
  public:
     Command(string name, CALLBACK* function){
        commandName = name;
        callBackFunction = function;
     }
     // Here, you can check your current environment
     // to see if you can execute this command in the current
     // configuration and system state
     bool CanExecute() = 0;

     // This method does the call to the callback
     void Execute(){
          // call the callback function here
     }
}