Я пытаюсь написать простой диспетчер, код пользователя может прикреплять к нему обратные вызовы. Каждое событие имеет известную подпись, а код пользователя должен вызвать диспетчеризацию с правильными номерами и типами аргументов. Это управляется переменными аргументами. Но, freestandingInt не принимается, поскольку вектор не имеет правильного типа. Как сделать его общим?Сборник std :: functions с различными аргументами
Следует минимальный пример
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);
}
Почему только один вид события? Как другой вопрос, сколько подписей? Может ли список быть централизованным? Какие ошибки при несоответствии аргументов в порядке? – Yakk
Вот и все, у меня нет надежды на сохранение только одного, я вынужден использовать наследование и хранить Event * на карте? –
'Событие *' бессмысленно. Перед этим я использую стирание типа стирания. Если есть более одного события, может быть более одного диспетчера. Почему нет? – Yakk