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