Как передать appUserFunc() в массив commands[]?

Имеется файл библиотеки и функция пользователя appUserFunc(). Как передать эту функцию в ячейку массива commands[].

#include "lib.h"

void appUserFunc(){ cout << "appUserFunc" << endl;}

int main()
{


    runTask();
}

file lib.h

#ifndef LIB_H
#define LIB_H

#include <iostream>
using namespace std;

void appSystemFunc(){ cout << "appSystemFunc" << endl;}


struct App
{   
    int num;
    string text;
    void (*f)(void);
};

App commands[]
{
    {1, "app system", appSystemFunc},
    {1, "app system", appUserFunc},
};

void runTask()
{
    for(App comm : commands)
    {
        comm.f();
    }
}

#endif

Ответы (1 шт):

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

Ну, я бы делал примерно так...

lib.h — только объявления

#pragma once
#include <string>
struct App
{   
    int num;
    std::string text;
    void (*f)(void);
};
void addTask(const App&);
void runTask();

lib.cpp — только реализации

#include <vector>
#include "lib.h"

namespace {
    std::vector<App> commands;
};

void addTask(const App& a)
{
    commands.push_back(a);
}

void runTask()
{
    for(App comm : commands)
    {
        comm.f();
    }
}

Ну, и где-то там использование

#include "lib.h"
#include <iostream>

using namespace std;

void appSystemFunc(){ cout << "appSystemFunc" << endl;}
void appUserFunc()  { cout << "appUserFunc" << endl;}

int main(int argc, char * argv[])
{
    addTask({1,"sys",appSystemFunc});
    addTask({2,"usr",appUserFunc});
    runTask();
}

Если же надо обходиться без вызовов addTask, то надо создавать объекты App, которые сами себя в конструкторе записывают в нужную коллекцию.

В любом случае, в .h — объявления, в .cpp — реализация.

→ Ссылка