我想向外界展示一个类的功能(成员函数),而不在它的公共部分中公开它的功能。这样用户就能够动态地知道/调用它的功能。以下是一些方法:
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*);
由于
答案 0 :(得分:0)
嗯,比通过矢量或一系列if-else
线性搜索更快,将使用例如std::map
( O(日志N)查找时间)或std::hash_map
(通常 O(1)查找时间。)
但真正的问题是:为什么要在运行时通过名称(即使用字符串)访问函数?当然索引或指针会更容易吗?换句话说,为什么Invoke()
函数的第一个参数是一个字符串?