クラスの機能 (メンバー関数) を公開セクションで公開せずに外の世界に提示したいと考えています。そのため、ユーザーはその機能を動的に知る/呼び出すことができます。以下にいくつかの方法を示します。
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*);
ありがとう