C 运行时成员函数通过字符串名称访问

C++ runtime member function access by string name

本文关键字:字符串 访问 运行时 成员 函数      更新时间:2023-10-16

我有两个类:

class MyClassInfo {
public:
  void AddMethod(std::string name, void* pointer); // I don't know what signature should be
}
class MyClass
{
public: 
  void SetField1(int f1);
  int GetFileld1();
private:
  int field1;
};

我需要能够在运行时通过名称(字符串)访问MyClass的方法。我不想使用任何库(Boost)和/或编译器功能(例如RTTI)来执行此操作。

我不知道我应该在AddMethod方法中使用哪种签名,因为我不知道如何将功能指针传输到函数。此功能必须是通用函数,允许添加任何方法。也许您知道一个更好的变体如何在没有MyClassInfo的情况下做到这一点。任何帮助将不胜感激。

在直接C 中不可能。您将必须查看替代方案,例如为成员功能指针创建名称地图。但即使那需要一致的方法签名。

之类的东西
std::map<std::string, int (MyClass::*)(void*))

例如。您的AddMethod签名将看起来像这样

void AddMethod(std::string name, int (MyClass::* pointer)(void*));

,您会像这样称呼它

info.AddMethod("someMethod", &MyClass::someMethod);

如果要通过AddMethod的所有功能都具有相同的签名(可能是在绑定某些参数之后),则可以使用此签名:

void AddMethod(std::string name, boost::function<int ()> func);

并这样使用:

info.AddMethod("GetFileId1", std::bind1st(std::mem_fun(&MyClass::GetFileId1), &MyClassInstance);

如果功能具有不同的签名,则可以使用boost::function_base

存储它们。
void AddMethod(std::string name, boost::function_base func);

您像上面一样使用它。现在的挑战是确切找出boost::function对象中存储的类型,以便您可以使用它。