在运行时呈现和使用功能

时间:2011-01-26 23:24:00

标签: c++ dynamic interface member-function-pointers


我想向外界展示一个类的功能(成员函数),而不在它的公共部分中公开它的功能。这样用户就能够动态地知道/调用它的功能。以下是一些方法:
a)提供成员函数的指针。在结构中提供的指针,带有一个附带的字符串来保存函数的名称。

class IBase
{
public:      
  typedef void (IBase::*FuncPtr)(Iparameter*);  
  typedef struct Module
  {
     FuncPtr Func;
     string Name; 
  };
  vector<Module> GetFunctions()const
  {  
    vector<Module> vec;  
    vec.push_back(Module(&F1, "F1"));  
    vec.push_back(Module(&F2,"F2"));  
    return vec;  
  }
private:  
  void F1(IParameter *param){}  
  void F2(IParameter *param){}  
};  

b)提供函数名称的字符串列表,以及一个带字符串参数的函数来调用指定的成员函数。

class IBase
{
public:
  void Invoke(string funcName, IParameter *param)
  {
   if(funcName=="F1")F1(param);
   else if(funcName=="F2")F2(param);
  }
private:  
  void F1(IParameter *param){}  
  void F2(IParameter *param){}
};

问题:哪种方法效率更高?有没有更好的方法?我正在重新发明轮子(boost :: function?)?

备注:
* IParameter就是这样一个类,旨在保存通用/自解释数据,每个函数都知道如何解释它。
*所有功能的签名都是相同的:

void FuncName(IParameter*);  

由于

1 个答案:

答案 0 :(得分:0)

嗯,比通过矢量或一系列if-else线性搜索更快,将使用例如std::map O(日志N)查找时间)或std::hash_map(通常 O(1)查找时间。)

但真正的问题是:为什么要在运行时通过名称(即使用字符串)访问函数?当然索引或指针会更容易吗?换句话说,为什么Invoke()函数的第一个参数是一个字符串?