Как передать функцию из класса в структуру
Есть код, вида.
struct Command
{
char const *text;
void (*f)(void);
bool active;
};
/* enumeration of objects - commands */
Command commands[]
{
{"clearcom", clearCommandTerminal, false},
{"dectop", desctop, true},
{"deepsleep", powerSaveDeepSleep, true},
{"systray", systemTray, true},
{"app_desctop", _desc.window("f"), true}
};
Допустим есть класс, вида
class Application
{
protected:
private:
public:
void window(String name, void (*f1)(void), void (*f2)(void));
void window();
};
Хочу реализовать механизм, при котором Пользователь создает объект класса Application app; далее его помещает в массив структур Commands, пример: {"clearcom", app.clearCommandTerminal, false},
Ответы (1 шт):
Если clearCommandTerminal - это нестатическая функция-член класса Application, тогда
#include <functional>
Application app;
Command commands[]
{
{ "clearcom", std::bind(&Application::clearCommandTerminal, &app), false}
};
Функция std::bind создаёт объект анонимного класса, содержащий оператор вызова, который вызывает функцию, переданную в качестве первого аргумента в bind. Вторым аргументом передан неявный первый параметр всех функций-членов класса: указатель this. Если функция, которую нужно вызвать, имеет явные параметры, то их можно указать следом.
Структуру Command придётся доработать, так как создаваемый функцией bind объект не имеет оператора преобразования к указателю на функцию.
struct Command
{
char const *text;
std::function<void(void)> f;
bool active;
};
Если же это статическая функция, то можно просто передать указатель на неё:
Command commands[]
{
{ "clearcom", &Application::clearCommandTerminal, false}
};
Доработка структуры Command не требуется.