【问题标题】:presentation and usage of functionality at runtime运行时功能的展示和使用
【发布时间】:2011-01-26 23:24:00
【问题描述】:


我想向外界展示一个类的功能(成员函数),而不在它的公共部分公开它的功能。因此用户将能够动态地知道/调用它的功能。以下是一些方法:
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*);  

谢谢

【问题讨论】:

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


    【解决方案1】:

    嗯,比线性搜索一个向量或一系列if-else 更快的是使用例如std::mapO(log N) 查找时间)或std::hash_map(通常O(1) 查找时间)。

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

    【讨论】:

    • 由于成员函数将显示在 GUI 中,因此我必须使用字符串(函数名称)导出它们。但是 Invoke 函数不需要在字符串中获取关于调用哪个函数的信息,当然它可以使用索引。
    • @Taz:我明白这一点。但是为人类可读的目的提供一个字符串并不意味着您需要使用该字符串在数据结构中执行查找。
    猜你喜欢
    • 2022-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2020-12-01
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多