Здравствуйте, k55, Вы писали:
k55>Простой вариант это иметь массив "variant"-ов (а-ля с труктура union с типов данных в ней) и передавать его в Callback.
для начала и так сойдёт, но в перспективе всё-таки захочется более сильного контроля над типами, поэтому я бы сделал так:
struct event_handler{
virtual on_mouse_event(int x, int y) {};
virtual on_file_system_event(file_desc f, e_file_event_data data) {}
virtual on_network_event(socket s, socket_data d) {};
};
void loop() {
if (event)
dispatch_dbus_event(event);
}
}
void dispatch_dbus_event(event) {
using std::for_each;
switch (event.type) {
case e_dbus_mouse: {
const auto info = dbus_event_to_mouse_info(event);
for_each(handlers.begin(), handlers.end(), [](event_handler& handler) { handler.on_mouse_event(info.x, info.y) });
break;
}
case e_dbus_file_system: {
const auto info = dbus_event_to_filesystem_info(event);
for_each(handlers.begin(), handlers.end(), [](event_handler& handler) { handler.on_file_system_event(info.f, info.data) });
break;
}
case e_dbus_network: {
const auto info = dbus_event_to_network_info(event);
for_each(handlers.begin(), handlers.end(), [](event_handler& handler) { handler.on_network_event(info.socket, info.data) });
break;
}
}
}
Вместо виртуальных функций можно использовать std::function, будет чуть меньше связность, но меньше и сцепленность