Как передать функцию из класса в структуру

Есть код, вида.

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 шт):

Автор решения: maestro

Если 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 не требуется.

→ Ссылка