fork download
  1. #include <functional>
  2. #include <list>
  3.  
  4. struct MyType {
  5.  
  6. MyType(int init): mValue(init) { }
  7.  
  8. void AddHandlerOnValueChanged(std::function<bool(MyType const &, int)> handlerOnValueChanged) {
  9. mHandlersOnValueChanged.push_back(handlerOnValueChanged);
  10. }
  11.  
  12. void ChangeValue(int value) {
  13. mValue = value;
  14. NotifyValueChanged(value);
  15. }
  16.  
  17. int GetValue(void) const {
  18. return mValue;
  19. }
  20.  
  21. private:
  22.  
  23. void NotifyValueChanged(int value) {
  24. auto & handlers = mHandlersOnValueChanged; // 長いのでエイリアス
  25. auto i = handlers.begin();
  26. auto e = handlers.end();
  27.  
  28. while(i != e) {
  29. if((*i)(*this, value)) {
  30. ++i;
  31. } else { // 返り値がfalseならハンドラーを削除
  32. i = handlers.erase(i);
  33. }
  34. }
  35. }
  36.  
  37. int mValue;
  38. std::list<std::function<bool(MyType const &, int)>> mHandlersOnValueChanged;
  39.  
  40. };
  41.  
  42. #include <iostream>
  43.  
  44. int main(void) {
  45. MyType obj(100);
  46.  
  47. obj.AddHandlerOnValueChanged([](MyType const & o, int v) { std::cout << "!" << v << std::endl; return v % 2 == 0; });
  48. obj.AddHandlerOnValueChanged([](MyType const & o, int v) { std::cout << "*" << v << std::endl; return v % 2 == 1; });
  49.  
  50. obj.ChangeValue(1);
  51. obj.ChangeValue(2);
  52. obj.ChangeValue(3);
  53.  
  54. return 0;
  55. }
  56.  
Success #stdin #stdout 0s 3020KB
stdin
Standard input is empty
stdout
!1
*1
*2