представление и использование функциональности во время выполнения - PullRequest
0 голосов
/ 27 января 2011


Я хочу представить функциональные возможности класса (функции-члены) внешнему миру, не раскрывая его функции в его публичном разделе. таким образом, пользователь сможет динамически узнавать / вызывать его функции. Вот несколько методов:
а) Предоставить указатели на функции-члены. указатели, которые подаются в структурах с сопровождающей строкой для хранения имени функции.

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 голосов
/ 27 января 2011

Ну, быстрее, чем линейный поиск по вектору или серии if-else, можно использовать, например, std::map ( O (log N) время поиска) или std::hash_map ( O (1) время поиска обычно).

Но реальный вопрос заключается в следующем: почему вы хотите получить доступ к функциям по имени (то есть со строкой) во время выполнения?Конечно, индекс или указатель будет проще?Другими словами, почему первый аргумент вашей Invoke() функции является строкой?

...