c++ - 将字符串作为对函数指针 C++ 的引用传递

标签 c++ protocols

下面是我的代码

 #include "stdafx.h"    
 #include <string.h>    
 #include <iostream.h>

 using namespace std;

 class ToDoCommands
 {
 public:    
     void getCommand(string);
 };

 void ToDoCommands::getCommand(string command) 
 {
     cout<<command;   //here i get ping
     void (*CommandToCall)(void);
     CommandToCall = command; // error here i want something like
                              //  CommandToCall = ping 
     CommandToCall();
 }

 void ping(void)
 { 
    cout<<"ping command executed";
 }

 int main()
 {
     ToDoCommands obj;
     obj.getCommand("ping");
 }

函数指针应该动态引用函数ping。将与函数名相同的字符串传递给 main 中的 getCommand 函数。

最佳答案

C++ 不能那样工作。如果你真的需要这样的东西,你必须制作一个按名称索引的函数表:

#include <assert.h>
#include <iostream>
#include <map>
#include <string>

using std::cout;
using std::string;
using std::map;

void ping(void)
{
  cout << "ping command executed\n";
}

class ToDoCommands
{
  public:
    typedef void (*FunctionPtr)();
    typedef string Name;

    void registerFunction(Name name,FunctionPtr);
    void callFunction(Name);

  private:
    map<Name,FunctionPtr> func_map;
};

void ToDoCommands::registerFunction(Name name,FunctionPtr func_ptr)
{
  func_map[name] = func_ptr;
}

void ToDoCommands::callFunction(Name name)
{
  assert(func_map.find(name)!=func_map.end());
  func_map[name]();
}

int main(int argc,char **argv)
{
  ToDoCommands to_do_commands;

  to_do_commands.registerFunction("ping",ping);
  to_do_commands.callFunction("ping");
  return 0;
}

关于c++ - 将字符串作为对函数指针 C++ 的引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12418248/

相关文章:

c++ - 是否可以仅通过标识符检查成员模板的存在?

c# - 创建要在 C# 中编码的 C++ Dll 的最佳实践

protocols - 如何在 Swift 中将协议(protocol)作为参数传递

swift - 跨集合扩展 customstringconvertible

Mac OSX 上的 C++ std::getline 大小限制

c++ - 如何在使用 JNI 的 C++/Java 项目中使用 CRT 中的工具检测内存泄漏?

c++ - struct c++的内存分配和释放

ios - 如何让所有子类都必须遵守协议(protocol)?

ios - Objective-c 中调用的 Swift 协议(protocol)不起作用

swift - 使用观察者模式设置委托(delegate)时遇到问题