0


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

ありがとう

4

1 に答える 1

0

ベクトルまたは一連のベクトルを線形検索するよりも、if-elseたとえばstd::mapO(log N)ルックアップ時間)またはstd::hash_map(通常はO(1)ルックアップ時間)を使用するよりも高速です。

しかし、本当の問題は、実行時に名前で(つまり文字列を使用して)関数にアクセスするのはなぜですか?確かに、インデックスやポインターの方が簡単でしょうか?言い換えると、Invoke()関数の最初の引数が文字列であるのはなぜですか?

于 2011-01-26T23:43:27.800 に答える