#include <iostream>
#include <vector>
#include <memory>
#include <functional>

class EventManager
{
public:
	template<class F>
	void AddClient(const F& receiver)
	{
		clients.emplace_back(new EventClient<F>(receiver));
	}
	
	void Emit()
	{
		for (const auto& client : clients)
		{
			client->Respond();
		}
	}
	
private:
	struct IEventClient {
		virtual ~IEventClient(){}
		virtual void Respond() = 0;
	};
	
	template<class F>
	struct EventClient : IEventClient
	{
		const F& f;
		EventClient(const F& f) : f(f){}
		void Respond() override { f(); }
	};
	
	std::vector<std::unique_ptr<IEventClient>> clients;
};

struct Foo
{
	void operator()() const { std::cout << "I'm a Foo!\n"; }
};


int main() {
	EventManager eventMan;
	
	eventMan.AddClient([]{ std::cout << "yo\n"; });
	
	std::function<void()> f = []{ std::cout << "I'm a std function!\n"; };
	eventMan.AddClient(f);
	
	eventMan.AddClient(Foo());
	
	eventMan.Emit();
}