//AsloSignals v1.0.0 #include #include #include namespace aslosignals { class SlotBase { public: virtual void emit() {} }; template class Slot : public SlotBase { public: void emit() override { std::apply(slot, parameters); } std::function slot; std::tuple parameters; }; class Signal { public: std::vector slots; // Connect Member Method template int connect_member(T *instance, void (T::*slot)(Args...), Args... parameters) { return bind((std::function)([=](Args...) { (instance->*slot)(parameters...); })); } // Connect Const Member Method template int connect_member(T *instance, void (T::*slot)(Args...) const, Args... parameters) { return bind((std::function)([=](Args...) { (instance->*slot)(parameters...); })); } // Connect Function template int connect(void (*slot)(Args...), Args... parameters) { return bind((std::function)([=](Args...) { (*slot)(parameters...); })); } void disconnect(int index) { slots.erase(slots.begin() + index); } void clear() { slots.clear(); } void operator()() { for (SlotBase *& slot : slots) { slot->emit(); } } private: template int bind(std::function slot) { Slot *_slot = new Slot(); _slot->slot = slot; slots.emplace_back(_slot); return slots.size() - 1; } }; template class TypeSignal { public: std::vector> slots; // Connect Member Method template int connect_member(T *instance, void (T::*slot)(Args...)) { return connect([=](Args... args) { (instance->*slot)(args...); }); } // Connect Const Member Method template int connect_member(T *instance, void (T::*slot)(Args...) const) { return connect([=](Args... args) { (instance->*slot)(args...); }); } // Connect Function int connect(std::function slot) { slots.emplace_back(slot); return slots.size() - 1; } void disconnect(int index) { slots.erase(slots.begin() + index); } void clear() { slots.clear(); } void operator()(Args... args) { for (std::function& slot : slots) { slot(args...); } } }; }