2

我有两节课:

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 的情况下做到这一点。任何帮助将不胜感激。

4

2 回答 2

2

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

就像是

std::map<std::string, int (MyClass::*)(void*))

例如。您的AddMethod签名将如下所示

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

你会这样称呼它

info.AddMethod("someMethod", &MyClass::someMethod);
于 2012-11-07T16:27:21.387 回答
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对象中存储的类型,以便您可以使用它。

于 2012-11-07T18:32:58.413 回答