Advertisement
Guest User

Untitled

a guest
Dec 12th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.43 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <tchar.h>
  3. #include <iostream>
  4.  
  5. // nagłówek konieczny gdy chcemy używać funktorów C++11
  6. #include <functional>
  7.  
  8. // CLASS03. Funktory.
  9.  
  10. // przykładowa funkcja, pobiera dwa argumenty typu int i zwraca jedną wartość int
  11. int Add(int x, int y)
  12. {
  13. return x + y;
  14. }
  15.  
  16. // inna funkcja o tej samej sygnaturze co funkcja Add
  17. int Mul(int x, int y)
  18. {
  19. return x * y;
  20. }
  21.  
  22. // definicja typu wskaźnika do funkcji o takiej sygnaturze jak Add i Mul
  23. typedef int(*func_ptr_t)(int, int);
  24.  
  25. // Function Object, który realizuje tą samą operację co funkcja Add
  26. class AddObj
  27. {
  28. public:
  29. int operator()(int x, int y)
  30. {
  31. return x + y;
  32. }
  33. };
  34.  
  35. // Function Object, który realizuje tą samą operację co funkcja Mul
  36. class MulObj
  37. {
  38. public:
  39. int operator()(int x, int y)
  40. {
  41. return x * y;
  42. }
  43. };
  44.  
  45. // funkcja "callback" wywołująca procedurę podaną przez użytkownika jako wskaźnik do funkcji
  46. void external_func(func_ptr_t user_callback)
  47. {
  48. std::cout << "external_func user_callback result: " << (*user_callback)(2, 3) << std::endl;
  49. }
  50.  
  51. // funkcja callback wywołująca procedurę podaną przez użytkownika jako function object
  52. void external_func(AddObj& user_callback)
  53. {
  54. std::cout << "external_func f.object result: " << user_callback(2, 3) << std::endl;
  55. }
  56.  
  57. // funkcja callback wywołująca procedurę użytkownika podaną jako uogólniony funktor
  58. void better_external_func(std::function<int(int, int)> user_callback)
  59. {
  60. std::cout << "better_external_func result: " << user_callback(2, 3) << std::endl;
  61. }
  62.  
  63. int _tmain(int argc, _TCHAR* argv[])
  64. {
  65. // inicjalizacja wskaźnika do funkcji
  66. func_ptr_t func_ptr = &Add;
  67.  
  68. // wywołanie funkcji poprzez wskaźnik
  69. std::cout << "func_ptr call result: " << (*func_ptr)(2, 3) << std::endl;
  70.  
  71. // wywołanie funkcji callback ze wskaźnikiem do funkcji
  72. external_func(Add);
  73.  
  74. // kolejne wywołanie funkcji callback ze wskaźnikiem, inna operacja o tej samej sygnaturze
  75. // ok, ale uwaga na niepożądany wynik, brak type safety!
  76. external_func(Mul);
  77.  
  78. // wywołanie funkcji callback z function object, jako argument podany nienazwany obiekt tymczasowy
  79. external_func(AddObj());
  80.  
  81. // kolejne wywołanie funkcji callback z function object, inna operacja o tej samej sygnaturze
  82. // błąd kompilacji, type safe!
  83. //external_func(MulObj());
  84.  
  85. // wywołanie funkcji callback przyjmującej funktor
  86. std::cout << "Call better_external_func with function pointer:" << std::endl;
  87. better_external_func(Add);
  88. std::cout << "Call better_external_func with function object:" << std::endl;
  89. better_external_func(AddObj());
  90. std::cout << "Call better_external_func with lambda:" << std::endl;
  91. better_external_func([](int x, int y){
  92. return x*x + y*y;
  93. });
  94.  
  95. // funkcja anonimowa (lambda) i capture list
  96. // [=] - zmienne z zakresu nadrzędnego dostępne tylko do odczytu
  97. // [&] - zmienne z zakresu nadrzędnego dostępne do zapisu
  98. // możliwa kontrola każdej zmiennej osobno
  99. int x = 0, z = 2;
  100. std::cout << "Before lambda call: x = " << x << ", z = " << z << std::endl;
  101. [&x, z](int y){ x = z + y; }(3);
  102. std::cout << "After lambda call: x = " << x << ", z = " << z << std::endl;
  103.  
  104. // funkcja lambda przechowywana jako zmienna:
  105. /*std::function<int(int, int)>*/auto sum_of_squares = [&](int a, int b) {
  106. return a*a + b*b;
  107. };
  108. // wywołanie funkcji lambda:
  109. std::cout << "lambda sum of squares call: " << sum_of_squares(3, 4) << std::endl;
  110.  
  111. return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement