Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <tchar.h>
- #include <iostream>
- // nagłówek konieczny gdy chcemy używać funktorów C++11
- #include <functional>
- // CLASS03. Funktory.
- // przykładowa funkcja, pobiera dwa argumenty typu int i zwraca jedną wartość int
- int Add(int x, int y)
- {
- return x + y;
- }
- // inna funkcja o tej samej sygnaturze co funkcja Add
- int Mul(int x, int y)
- {
- return x * y;
- }
- // definicja typu wskaźnika do funkcji o takiej sygnaturze jak Add i Mul
- typedef int(*func_ptr_t)(int, int);
- // Function Object, który realizuje tą samą operację co funkcja Add
- class AddObj
- {
- public:
- int operator()(int x, int y)
- {
- return x + y;
- }
- };
- // Function Object, który realizuje tą samą operację co funkcja Mul
- class MulObj
- {
- public:
- int operator()(int x, int y)
- {
- return x * y;
- }
- };
- // funkcja "callback" wywołująca procedurę podaną przez użytkownika jako wskaźnik do funkcji
- void external_func(func_ptr_t user_callback)
- {
- std::cout << "external_func user_callback result: " << (*user_callback)(2, 3) << std::endl;
- }
- // funkcja callback wywołująca procedurę podaną przez użytkownika jako function object
- void external_func(AddObj& user_callback)
- {
- std::cout << "external_func f.object result: " << user_callback(2, 3) << std::endl;
- }
- // funkcja callback wywołująca procedurę użytkownika podaną jako uogólniony funktor
- void better_external_func(std::function<int(int, int)> user_callback)
- {
- std::cout << "better_external_func result: " << user_callback(2, 3) << std::endl;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- // inicjalizacja wskaźnika do funkcji
- func_ptr_t func_ptr = &Add;
- // wywołanie funkcji poprzez wskaźnik
- std::cout << "func_ptr call result: " << (*func_ptr)(2, 3) << std::endl;
- // wywołanie funkcji callback ze wskaźnikiem do funkcji
- external_func(Add);
- // kolejne wywołanie funkcji callback ze wskaźnikiem, inna operacja o tej samej sygnaturze
- // ok, ale uwaga na niepożądany wynik, brak type safety!
- external_func(Mul);
- // wywołanie funkcji callback z function object, jako argument podany nienazwany obiekt tymczasowy
- external_func(AddObj());
- // kolejne wywołanie funkcji callback z function object, inna operacja o tej samej sygnaturze
- // błąd kompilacji, type safe!
- //external_func(MulObj());
- // wywołanie funkcji callback przyjmującej funktor
- std::cout << "Call better_external_func with function pointer:" << std::endl;
- better_external_func(Add);
- std::cout << "Call better_external_func with function object:" << std::endl;
- better_external_func(AddObj());
- std::cout << "Call better_external_func with lambda:" << std::endl;
- better_external_func([](int x, int y){
- return x*x + y*y;
- });
- // funkcja anonimowa (lambda) i capture list
- // [=] - zmienne z zakresu nadrzędnego dostępne tylko do odczytu
- // [&] - zmienne z zakresu nadrzędnego dostępne do zapisu
- // możliwa kontrola każdej zmiennej osobno
- int x = 0, z = 2;
- std::cout << "Before lambda call: x = " << x << ", z = " << z << std::endl;
- [&x, z](int y){ x = z + y; }(3);
- std::cout << "After lambda call: x = " << x << ", z = " << z << std::endl;
- // funkcja lambda przechowywana jako zmienna:
- /*std::function<int(int, int)>*/auto sum_of_squares = [&](int a, int b) {
- return a*a + b*b;
- };
- // wywołanie funkcji lambda:
- std::cout << "lambda sum of squares call: " << sum_of_squares(3, 4) << std::endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement