#include <iostream>
#include <forward_list>
using namespace std;

class EventResizeEventListener
{
public:
	virtual ~EventResizeEventListener() = default;
	virtual void Resize(uint32_t w, uint32_t h) = 0;
};

template<typename T, typename ... Args>
class EventSignal
{
	typedef void(T::*Func)(Args ...);
	struct listData
	{
		void operator()(Args ...args) { (listener->*func)(args ...); }
		
		T *listener = nullptr;
		Func func;
		bool active = false;
	};

public:

	void Connect(T *listener, void(T::*f)(Args ...))
	{
		// todo: register id
		listData data = { listener, f, true };
		m_lists.emplace_front(data);
	}

	void operator()(Args ...args) noexcept
	{
		for (auto &i : m_lists)
		{
			if (i.active)
			{
				i(args...);
			}
			else
				;// todo: remove
		}
	}

private:
	std::forward_list<listData> m_lists;
};


// кастомный класс
class FooBla : public EventResizeEventListener
{
public:
	void Resize(uint32_t w, uint32_t h) final
	{
		std::cout << w << " " << h << std::endl;
	}
};


int main() {
	FooBla fff;

	// класс оповещения
	EventSignal<EventResizeEventListener, uint32_t, uint32_t> siga;

	// регистрация слушателя
	siga.Connect(&fff, &EventResizeEventListener::Resize);

	// оповещение
	siga(10, 20);
	
	return 0;
}