#include <functional>
#include <list>

struct MyType {

  MyType(int init): mValue(init) { }

  void AddHandlerOnValueChanged(std::function<bool(MyType const &, int)> handlerOnValueChanged) {
    mHandlersOnValueChanged.push_back(handlerOnValueChanged);
  }

  void ChangeValue(int value) {
    mValue = value;
    NotifyValueChanged(value);
  }

  int GetValue(void) const {
    return mValue;
  }

private:
 
  void NotifyValueChanged(int value) {
    auto & handlers = mHandlersOnValueChanged; // 長いのでエイリアス
    auto i = handlers.begin();
    auto e = handlers.end();
    
    while(i != e) {    
      if((*i)(*this, value)) {
        ++i;
      } else { // 返り値がfalseならハンドラーを削除
        i = handlers.erase(i);
      }
    }
  }

  int mValue;
  std::list<std::function<bool(MyType const &, int)>> mHandlersOnValueChanged; 

};

#include <iostream>

int main(void) {
  MyType obj(100);
  
  obj.AddHandlerOnValueChanged([](MyType const & o, int v) { std::cout << "!" << v << std::endl; return v % 2 == 0; });
  obj.AddHandlerOnValueChanged([](MyType const & o, int v) { std::cout << "*" << v << std::endl; return v % 2 == 1; });

  obj.ChangeValue(1);
  obj.ChangeValue(2);
  obj.ChangeValue(3);

  return 0;
}
