C ++运行时成员函数按字符串名称访问

时间:2012-11-07 16:25:51

标签: c++ function-pointers

我有两个班级:

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方法中使用哪个签名,因为我不知道如何将函数指针传递给该函数。此功能必须是通用功能,允许添加任何方法。 Mb,你知道如何在没有MyClassInfo的情况下做更好的变体。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

直接使用C ++是不可能的。您将不得不查看替代方法,例如为成员函数指针创建名称映射。但即使这样也需要一致的方法签名。

这样的东西
std::map<std::string, int (MyClass::*)(void*))
例如

。您的AddMethod签名将如下所示

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

你可以这样称呼它

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

答案 1 :(得分:0)

如果您要通过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对象中存储的确切类型,以便您可以使用它。