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

template <typename T>
class Event
{
public:
    using func = std::function<void(T)>;


    void Raise(T arg)
    {
        for (auto handler : _handlers)
        {
            handler(arg);
        }        
    }

    void operator ()(T arg)
    {
        Raise(arg);
    }

    Event& operator += (func f)
    {
        _handlers.push_back(f);
        return *this;
    }

    Event& operator -= (func f)
    {
        for (auto handler : _handlers)
        {
            
            if (handler.template target<void(T)>() == f.template target<void(T)>())
            {
                _handlers.erase(handler);
                break;
            }
        }

        return *this;
    }

private:
    std::vector<func> _handlers;
};

class SomeClass
{
 public:
       Event<std::string> SomethingChanged;
};

class Onemoreclass
{
     SomeClass _someClass{};
public: 
   Onemoreclass()
  {
      _someClass.SomethingChanged  += std::bind(&Onemoreclass::Print, *this, std::placeholders::_1);
  }

private:
    void Print(std::string message)   {std::cout << message << std::endl; }
};

int main() {
	// your code goes here
	Onemoreclass one;
	
	return 0;
}