Zbiór funkcji std :: z różnymi argumentami
Próbuję napisać prosty dyspozytor, kod użytkownika może dołączyć do niego wywołania zwrotne. Każde zdarzenie ma znaną sygnaturę, a kod użytkownika musi wywołać wysyłkę z odpowiednim numerem i typem argumentu. Jest to zarządzane przez zmienne argumenty. Ale wolnostojący nie jest akceptowany, ponieważ wektor nie jest właściwego typu. Jak to zrobić?
Podąża za minimalnym przykładem
void freestanding() {
std::cout << "freestanding" << std::endl;
}
void freestandingInt(int iArg) {
std::cout << "freestandingInt " << iArg << std::endl;
}
struct Dispatcher {
typedef struct Event_ {
std::vector<std::function<void()> > listeners;
} Event;
template<class... Args>
void dispatch(int eventNr, Args&&... args) {
for (auto listener: events[eventNr].listeners) {
std::function<void()> f(std::bind(listener, std::forward<Args>(args)...));
f();
}
}
std::map<int, Event> events;
};
int main (int argc, char **argv) {
Dispatcher disp;
disp.events[0].listeners.push_back(freestanding);
disp.dispatch(0); // OK
// error here
//disp.events[1].listeners.push_back(freestandingInt);
}