#include <iostream>
#include <functional>
#include <vector>
#include <string>
#include <memory>
struct NetworkEvent {
int statusCode;
std::string payload;
};
void logEventToConsole(const NetworkEvent& event) {
std::cout << "[Console Logger] Status: " << event.statusCode
<< " | Data: " << event.payload << "\n";
}
class DatabaseSaver {
public:
void saveToTableA(const NetworkEvent& event) {
std::cout << "[DB Saver] Saving to Table A -> " << event.payload << "\n";
}
void saveToTableB(const NetworkEvent& event, const std::string& schema) {
std::cout << "[DB Saver] Saving to Table B (" << schema << ") -> " << event.payload << "\n";
}
};
class NetworkEventManager {
private:
std::vector<std::function<void(const NetworkEvent&)>> handlers;
public:
void registerHandler(std::function<void(const NetworkEvent&)> handler) {
if (handler) {
handlers.push_back(handler);
}
}
void broadcast(const NetworkEvent& event) {
std::cout << "\n--- Broadcasting Event (" << event.statusCode << ") ---\n";
for (const auto& handler : handlers) {
handler(event);
}
}
};
int main() {
NetworkEventManager manager;
DatabaseSaver dbSaver;
manager.registerHandler(logEventToConsole);
int executionCount = 0;
manager.registerHandler([&executionCount](const NetworkEvent& event) {
executionCount++;
std::cout << "[Stateful Lambda] Runs: " << executionCount
<< " | Processing length: " << event.payload.length() << "\n";
});
manager.registerHandler(([&dbSaver](const NetworkEvent& event) {
dbSaver.saveToTableA(event);
}));
manager.registerHandler(std::bind(&DatabaseSaver::saveToTableB, &dbSaver, std::placeholders::_1, "PROD_SCHEMA"));
NetworkEvent event1{200, "User Login Success"};
NetworkEvent event2{404, "Resource Not Found"};
manager.broadcast(event1);
manager.broadcast(event2);
std::function<void(const NetworkEvent&)> emptyFunc = nullptr;
if (!emptyFunc) {
std::cout << "\n[Safety Check] emptyFunc is safely uninitialized, won't throw std::bad_function_call\n";
}
return 0;
}