Я хочу представить функциональные возможности класса (функции-члены) во внешний мир, не подвергая его функциям в его публичном разделе. поэтому пользователь сможет динамически знать/вызывать свои функции. Вот некоторые методы:
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*);
Благодаря
Поскольку функции-члены будут отображаться в графическом интерфейсе, я должен экспортировать их со строкой (имя функции). Но функции Invoke не нужно брать информацию о том, какую функцию вызывать в строке, конечно, она может использовать индекс. – sithereal
@ Таз: Я это понимаю. Но предоставление строки для удобочитаемых целей не означает, что вам нужно выполнять поиск в вашей структуре данных с помощью этой строки. –