SlideShare a Scribd company logo
1 of 32
Generalized FUNCTORS В рамках курсу “Актуальні проблеми програмної інженерії”, 2009 р. Лозинський Ігор, Фін-3
Ги-ги… Додаткова інформація: В презентації 32 сторінки   Наперед перепрошую за всі лажі та  недопрацювання. 
Майже гасло Витончені технології призначені для досягнення простоти. ( original :  Clever techniques should be applied for the benefit of simplicity.   )‏
Що воно таке? Узагальнений функтор  – це будь-який виклик процедури, що дозволений в С++ та інкапсульований в об'єкт першого класу, який гарантує типову безпеку generalized functor is any processing invocation that C++ allows, encapsulated as a typesafe first-class object
Для чого? Узагальнені функтори дозволяють зберігати виклики процедур у вигляді значень, передавати їх в якості параметрів, і виконувати іх далеко від місця створення. Суттєвою відмінністю між вказівниками на функції та узагальненими функторами в тому, що останні можуть зберігати стан об'єкта та викликати його методи.
The Command Design Pattern Gamma, Erich, Richard Helm, Ralph Johnson, and John Vlissides . 1995. Design Patterns: Elements of Reusable Object-Oriented Software.
Що це дає? Модуль, що здійснює виклик не тільки не знає як виконується робота, а й не має уявлення для якого виду роботи призначений клас  Command
Застосування ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
В реальному житті ,[object Object],[object Object]
Generalized callback void  Foo();  void  Bar(); int  main()‏ { void  (*pF)() = &Foo; Foo();  // Call Foo directly Bar();  // Call Bar directly (*pF)();  // Call Foo via pF void  (*pF2)() = pF;  // Create a copy of pF pF = &Bar;  // Change pF to point to Bar (*pF)();  // Now call Bar via pF (*pF2)();  // Call Foo via pF2 }
Ті, що підтримують  operator()   ( callable )‏ ,[object Object],[object Object],[object Object],[object Object],[object Object]
Скелет  Functor ’ а ,[object Object],[object Object]
Починаємо реалізовувати ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Виходить без шаблонів ніяк? template  < typename  ResultType> class Functor  { public: ResultType  operator ()();  // other member functions private: // implementation };
Ну а де аргументи? Ми не маємо морального права накладати обмеження на кількість аргументів  operator() ’ а та на їх тип. Крім того змінних шаблонів в С++ немає. А еліпси  ( ellipsis )   типу  printf   – це не красиво, та ще й небезпечно. Що робити?
Так теж не годиться // Functor with no arguments template < typename  ResultType> class Functor  { ... }; // Functor with one argument template < typename  ResultType, typename Parm1> class Functor  { ...   };
Списки типів   < typename  ResultType,  class  TList> class Functor  { ... };   Functor <double,  TYPELIST_2 (int, double)>  m yFunctor;
Але й списки не ідеальні template  < typename  R> class  FunctorImpl<R, NullType> { public: virtual  R  operator() () = 0; virtual  FunctorImpl* Clone()  const  = 0; virtual  ~FunctorImpl() {} }; template  < typename  R,  typename  P1> class  FunctorImpl<R, TYPELIST_1(P1)>{ public:  virtual  R  operator() (P1) = 0; virtual  FunctorImpl* Clone() const = 0; virtual  ~FunctorImpl() {} };
Сам пан  Functor template   < typename  R,  class  TList> class  Functor { public: Functor(); Functor( const  Functor&); Functor& operator=( const  Functor&); explicit  Functor( std::auto_ptr <Impl> spImpl); ... private:  FunctorImpl<R, TList> Impl; std::auto_ptr <Impl> spImpl_; };
Маленька хитрість ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Реалізація  operator() ’ а template  < typename  R,  class  TList> class  Functor { ... as above ... public: R  operator() ()  {  return  (*spImpl_)(); } R  operator() (Parm1 p1)‏ {  return  (*spImpl_)(p1); } R  operator() (Parm1 p1, Parm2 p2)‏ {  return  (*spImpl_)(p1, p2); }  };
В чому фокус? Functor<double, TYPELIST_2(int, double)> myFunctor; double result = myFunctor(4, 5.6); // Wrong invocation. double result = myFunctor();
Робота з функторами ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Так багато коду для одного конструктора template  < class  ParentFunctor,  typename  Fun> class  FunctorHandler :  public  FunctorImpl   <   typename  ParentFunctor::ResultType,   typename  ParentFunctor::ParmList   > { public : typedef typename  ParentFunctor::ResultType ResultType; …
…  готуємо конструктор FunctorHandler( const  Fun& fun) : fun_(fun) {} FunctorHandler* Clone()  const  { return   new  FunctorHandler(*this); } ResultType  operator() () { return fun_(); } ResultType  operator() ( typename  ParentFunctor::Parm1 p1) { return  fun_(p1); } ResultType  operator() ( typename  ParentFunctor::Parm1 p1,  typename  ParentFunctor::Parm2 p2){ return  fun_(p1, p2); } private: Fun  fun_ ;  };
Нарешті вимучили наш конструктор ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Тестуємо – все красиво #include   “ Functor.h ” #include  <iostream> struct  TestFunctor { void  operator() (int i, double d) { cout <<&quot;TestFunctor::operator()(&quot; << i << &quot;, &quot; << d << &quot;)  called.&quot;; }  }; int main() { TestFunctor f; Functor<void, TYPELIST_2(int, double)>  cmd(f); cmd(4, 4.5); }
Не просто красиво – дуже красиво ,[object Object],[object Object],[object Object]
Вказівники на методи об'єктів ,[object Object],[object Object]
Бонуси ,[object Object],[object Object],[object Object]
Де це знайти? ,[object Object],[object Object],[object Object],[object Object]
Ніби кінець… ,[object Object],[object Object]

More Related Content

What's hot

07 Localisation
07 Localisation07 Localisation
07 Localisationolegapster
 
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5Nikita Pavliuchenko
 
09 Static Polymorphism
09 Static Polymorphism09 Static Polymorphism
09 Static Polymorphismolegapster
 
урок 19 цикли Складання програм
урок 19 цикли Складання програмурок 19 цикли Складання програм
урок 19 цикли Складання програмHelen Pat
 
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7Nikita Pavliuchenko
 
Advanced C#. Part 2
Advanced C#. Part 2Advanced C#. Part 2
Advanced C#. Part 2eleksdev
 
Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Dmitry Chabanenko
 
урок 12 вирази мова Паскаль
урок 12 вирази  мова Паскальурок 12 вирази  мова Паскаль
урок 12 вирази мова ПаскальHelen Pata
 
01 Incapsulation
01 Incapsulation01 Incapsulation
01 Incapsulationolegapster
 
Programuvanna na movi_pascal
Programuvanna na movi_pascalProgramuvanna na movi_pascal
Programuvanna na movi_pascalAnn Eres
 
System programing module 1. Processes
System programing module 1. ProcessesSystem programing module 1. Processes
System programing module 1. ProcessesAndrii Hladkyi
 
головне меню за допомогою Label
головне меню за допомогою Labelголовне меню за допомогою Label
головне меню за допомогою Labelantalia1010
 
вказівки повторення і розгалуження
вказівки повторення і розгалуженнявказівки повторення і розгалуження
вказівки повторення і розгалуження1cana1
 
Lecture 13 Local Optimization on Mobile Devices
Lecture 13 Local Optimization on Mobile DevicesLecture 13 Local Optimization on Mobile Devices
Lecture 13 Local Optimization on Mobile DevicesMaksym Davydov
 

What's hot (20)

07 Localisation
07 Localisation07 Localisation
07 Localisation
 
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
 
09 Static Polymorphism
09 Static Polymorphism09 Static Polymorphism
09 Static Polymorphism
 
урок 19 цикли Складання програм
урок 19 цикли Складання програмурок 19 цикли Складання програм
урок 19 цикли Складання програм
 
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7
 
Advanced C#. Part 2
Advanced C#. Part 2Advanced C#. Part 2
Advanced C#. Part 2
 
Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1
 
урок 12 вирази мова Паскаль
урок 12 вирази  мова Паскальурок 12 вирази  мова Паскаль
урок 12 вирази мова Паскаль
 
07 Containers
07 Containers07 Containers
07 Containers
 
01 Incapsulation
01 Incapsulation01 Incapsulation
01 Incapsulation
 
Похідна
ПохіднаПохідна
Похідна
 
9 13
9 139 13
9 13
 
9 14
9 149 14
9 14
 
Конкурсна робота
Конкурсна роботаКонкурсна робота
Конкурсна робота
 
Programuvanna na movi_pascal
Programuvanna na movi_pascalProgramuvanna na movi_pascal
Programuvanna na movi_pascal
 
System programing module 1. Processes
System programing module 1. ProcessesSystem programing module 1. Processes
System programing module 1. Processes
 
головне меню за допомогою Label
головне меню за допомогою Labelголовне меню за допомогою Label
головне меню за допомогою Label
 
вказівки повторення і розгалуження
вказівки повторення і розгалуженнявказівки повторення і розгалуження
вказівки повторення і розгалуження
 
Lecture 13 Local Optimization on Mobile Devices
Lecture 13 Local Optimization on Mobile DevicesLecture 13 Local Optimization on Mobile Devices
Lecture 13 Local Optimization on Mobile Devices
 
Lecture 07 swift
Lecture 07 swiftLecture 07 swift
Lecture 07 swift
 

Similar to General Functors

Лекція №12 Передача параметрів у функцію.pptx
Лекція №12 Передача параметрів у функцію.pptxЛекція №12 Передача параметрів у функцію.pptx
Лекція №12 Передача параметрів у функцію.pptxssuserf57884
 
05 Operations And Utilities
05 Operations And Utilities05 Operations And Utilities
05 Operations And Utilitiesolegapster
 
Основи мови Ci
Основи мови CiОснови мови Ci
Основи мови CiEscuela
 
інформатика алгор та прогр по підручнику верлань 2 стор на 1 листку
інформатика алгор та прогр по підручнику верлань 2 стор на 1 листкуінформатика алгор та прогр по підручнику верлань 2 стор на 1 листку
інформатика алгор та прогр по підручнику верлань 2 стор на 1 листкуШкола №7 Миргород
 
опорні схеми
опорні схемиопорні схеми
опорні схемиIrina Tabanets
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym KindritskyiFwdays
 
11 Iterated Containers
11 Iterated Containers11 Iterated Containers
11 Iterated Containersolegapster
 

Similar to General Functors (20)

Функції в C++
Функції в C++Функції в C++
Функції в C++
 
Лекція №12 Передача параметрів у функцію.pptx
Лекція №12 Передача параметрів у функцію.pptxЛекція №12 Передача параметрів у функцію.pptx
Лекція №12 Передача параметрів у функцію.pptx
 
05 Operations And Utilities
05 Operations And Utilities05 Operations And Utilities
05 Operations And Utilities
 
події
подіїподії
події
 
передача параметрів в функції
передача параметрів в функціїпередача параметрів в функції
передача параметрів в функції
 
Основи мови Ci
Основи мови CiОснови мови Ci
Основи мови Ci
 
04 Operators
04 Operators04 Operators
04 Operators
 
Урок 44. Цикл з післяумовою
Урок 44. Цикл з післяумовоюУрок 44. Цикл з післяумовою
Урок 44. Цикл з післяумовою
 
Урок 23. Події. Обробники подій
Урок 23. Події. Обробники подійУрок 23. Події. Обробники подій
Урок 23. Події. Обробники подій
 
tsql
tsqltsql
tsql
 
інформатика алгор та прогр по підручнику верлань 2 стор на 1 листку
інформатика алгор та прогр по підручнику верлань 2 стор на 1 листкуінформатика алгор та прогр по підручнику верлань 2 стор на 1 листку
інформатика алгор та прогр по підручнику верлань 2 стор на 1 листку
 
опорні схеми
опорні схемиопорні схеми
опорні схеми
 
2
22
2
 
2
22
2
 
2
22
2
 
5971 789623
5971 7896235971 789623
5971 789623
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
 
11 Iterated Containers
11 Iterated Containers11 Iterated Containers
11 Iterated Containers
 
Design patterns part 1
Design patterns part 1Design patterns part 1
Design patterns part 1
 
Funkciji1
Funkciji1Funkciji1
Funkciji1
 

General Functors

  • 1. Generalized FUNCTORS В рамках курсу “Актуальні проблеми програмної інженерії”, 2009 р. Лозинський Ігор, Фін-3
  • 2. Ги-ги… Додаткова інформація: В презентації 32 сторінки Наперед перепрошую за всі лажі та недопрацювання. 
  • 3. Майже гасло Витончені технології призначені для досягнення простоти. ( original : Clever techniques should be applied for the benefit of simplicity. )‏
  • 4. Що воно таке? Узагальнений функтор – це будь-який виклик процедури, що дозволений в С++ та інкапсульований в об'єкт першого класу, який гарантує типову безпеку generalized functor is any processing invocation that C++ allows, encapsulated as a typesafe first-class object
  • 5. Для чого? Узагальнені функтори дозволяють зберігати виклики процедур у вигляді значень, передавати їх в якості параметрів, і виконувати іх далеко від місця створення. Суттєвою відмінністю між вказівниками на функції та узагальненими функторами в тому, що останні можуть зберігати стан об'єкта та викликати його методи.
  • 6. The Command Design Pattern Gamma, Erich, Richard Helm, Ralph Johnson, and John Vlissides . 1995. Design Patterns: Elements of Reusable Object-Oriented Software.
  • 7. Що це дає? Модуль, що здійснює виклик не тільки не знає як виконується робота, а й не має уявлення для якого виду роботи призначений клас Command
  • 8.
  • 9.
  • 10. Generalized callback void Foo(); void Bar(); int main()‏ { void (*pF)() = &Foo; Foo(); // Call Foo directly Bar(); // Call Bar directly (*pF)(); // Call Foo via pF void (*pF2)() = pF; // Create a copy of pF pF = &Bar; // Change pF to point to Bar (*pF)(); // Now call Bar via pF (*pF2)(); // Call Foo via pF2 }
  • 11.
  • 12.
  • 13.
  • 14. Виходить без шаблонів ніяк? template < typename ResultType> class Functor { public: ResultType operator ()(); // other member functions private: // implementation };
  • 15. Ну а де аргументи? Ми не маємо морального права накладати обмеження на кількість аргументів operator() ’ а та на їх тип. Крім того змінних шаблонів в С++ немає. А еліпси ( ellipsis ) типу printf – це не красиво, та ще й небезпечно. Що робити?
  • 16. Так теж не годиться // Functor with no arguments template < typename ResultType> class Functor { ... }; // Functor with one argument template < typename ResultType, typename Parm1> class Functor { ... };
  • 17. Списки типів  < typename ResultType, class TList> class Functor { ... }; Functor <double, TYPELIST_2 (int, double)> m yFunctor;
  • 18. Але й списки не ідеальні template < typename R> class FunctorImpl<R, NullType> { public: virtual R operator() () = 0; virtual FunctorImpl* Clone() const = 0; virtual ~FunctorImpl() {} }; template < typename R, typename P1> class FunctorImpl<R, TYPELIST_1(P1)>{ public: virtual R operator() (P1) = 0; virtual FunctorImpl* Clone() const = 0; virtual ~FunctorImpl() {} };
  • 19. Сам пан Functor template < typename R, class TList> class Functor { public: Functor(); Functor( const Functor&); Functor& operator=( const Functor&); explicit Functor( std::auto_ptr <Impl> spImpl); ... private: FunctorImpl<R, TList> Impl; std::auto_ptr <Impl> spImpl_; };
  • 20.
  • 21. Реалізація operator() ’ а template < typename R, class TList> class Functor { ... as above ... public: R operator() () { return (*spImpl_)(); } R operator() (Parm1 p1)‏ { return (*spImpl_)(p1); } R operator() (Parm1 p1, Parm2 p2)‏ { return (*spImpl_)(p1, p2); } };
  • 22. В чому фокус? Functor<double, TYPELIST_2(int, double)> myFunctor; double result = myFunctor(4, 5.6); // Wrong invocation. double result = myFunctor();
  • 23.
  • 24. Так багато коду для одного конструктора template < class ParentFunctor, typename Fun> class FunctorHandler : public FunctorImpl < typename ParentFunctor::ResultType, typename ParentFunctor::ParmList > { public : typedef typename ParentFunctor::ResultType ResultType; …
  • 25. … готуємо конструктор FunctorHandler( const Fun& fun) : fun_(fun) {} FunctorHandler* Clone() const { return new FunctorHandler(*this); } ResultType operator() () { return fun_(); } ResultType operator() ( typename ParentFunctor::Parm1 p1) { return fun_(p1); } ResultType operator() ( typename ParentFunctor::Parm1 p1, typename ParentFunctor::Parm2 p2){ return fun_(p1, p2); } private: Fun fun_ ; };
  • 26.
  • 27. Тестуємо – все красиво #include “ Functor.h ” #include <iostream> struct TestFunctor { void operator() (int i, double d) { cout <<&quot;TestFunctor::operator()(&quot; << i << &quot;, &quot; << d << &quot;) called.&quot;; } }; int main() { TestFunctor f; Functor<void, TYPELIST_2(int, double)> cmd(f); cmd(4, 4.5); }
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.