我有两个班级:
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的情况下做更好的变体。任何帮助将不胜感激。
答案 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
对象中存储的确切类型,以便您可以使用它。