2011-01-26 3 views
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){} 
}; 

б) предоставить список строк имен функций, плюс функция, принимающая параметр строки для вызова заданной функции члена.

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

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

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

+0

Поскольку функции-члены будут отображаться в графическом интерфейсе, я должен экспортировать их со строкой (имя функции). Но функции Invoke не нужно брать информацию о том, какую функцию вызывать в строке, конечно, она может использовать индекс. – sithereal

+0

@ Таз: Я это понимаю. Но предоставление строки для удобочитаемых целей не означает, что вам нужно выполнять поиск в вашей структуре данных с помощью этой строки. –

Смежные вопросы