C++ Library Extensions 2022.12.09
To help learn modern C++ programming
09-functor.cpp
Go to the documentation of this file.
1#include <tpf_output.hpp>
2
3/*
4 Lambda is nothing but a function object, or is called "functor"
5 */
8
9class Functor
10{
11 private:
12 int m_offset;
13
14 public:
15
16 Functor(int offset): m_offset{ offset } {}
17
18 // function call operator
19 int operator()(int a, int b) const
20 {
21 return m_offset * (a + b);
22 }
23};
24
26{
27 Functor f{10};
28
29 stream <<"50 will be returned: " << f(2, 3) << endl;
30
31 Functor g{20};
32
33 stream << "100 will be returned: " << g(2, 3) << endl;
34
35 auto h = [offset = 10](int a, int b)
36 {
37 return offset *(a+b);
38 };
39
40 stream << "calling lambda(2, 3) : " << h(2, 3) << endl;
41
42 auto j = [offset = 25](int a, int b)
43 {
44 return offset * (a * b);
45 };
46
47 stream << "calling j(2, 2) ? " << j(2, 2) << endl;
48
49}
50
51class DummyClass
52{
53 private:
54 int m_data;
55
56 public:
57 DummyClass(int value = 0):
58 m_data{value} { }
59
60 int sum(int a, int b)
61 {
62 return m_data*(a + b);
63 }
64
65 int pro(int a, int b)
66 {
67 return m_data*(a * b);
68 }
69
70 double square(double v)
71 {
72 return v * v / m_data;
73 }
74};
75
76// we defined type alias for member function
77// that belongs to DummyClass
78// returns int, and takes two ints
79using mem_function_t = int(DummyClass::*)(int, int);
80
81int call_mem(DummyClass& d, mem_function_t fptr, int a, int b)
82{
83 return (d.*fptr)(a, b);
84}
85
87{
88 return (dptr->*fptr)(a, b);
89}
90
92{
93 DummyClass d{20};
94
95 auto rlt = call_mem(d, &DummyClass::sum, 2, 3);
96
97 stream << "rlt: " << rlt << endl;
98
99}
100
102{
103 DummyClass d{20};
104
105 auto rlt = call_mem_through_obj_ptr(&d, &DummyClass::pro, 2, 3);
106
107 stream << "rlt: " << rlt << endl;
108}
109
111{
112 // the type of function sum
113 // int(int, int);
114
115 // here fptr is a pointer instance
116 // int* fptr (int, int); // this is a function declaration that
117 // return a int*, and takes two ints
118
119 // fptr is un-initialized function pointer declaration
120 int (*fptr) (int, int); // fptr is a function pointer that points to a function
121 // that returns an int, and takes two ints and parameters(arguments)
122
123 // now, mfptr is a member function pointer
124 // that belongs to DummyClass,
125 // that return int, and takes two ints
126 int ( DummyClass:: *mfptr )(int, int);
127
128 DummyClass d1{10};
129
130 // we assigned the address of member function sum
131 // that belongs to DummyClass
132 mfptr = &DummyClass::sum;
133
134 auto r = (d1.*mfptr)(2, 3); // d1.sum(2, 3);
135
136 stream << "r = " << r << endl;
137
138 mfptr = &DummyClass::pro;
139
140 r = (d1.*mfptr)(2, 3); // d1.pro(2, 3);
141
142 stream << "r = " << r << endl;
143}
144
145int main()
146{
147 // test_functor();
148
149 // test_member_function_pointer();
150
151 // test_call_mem();
152
154}
int call_mem(DummyClass &d, mem_function_t fptr, int a, int b)
Definition: 09-functor.cpp:81
tpf::sstream stream
Definition: 09-functor.cpp:6
void test_call_mem_through_obj_ptr()
Definition: 09-functor.cpp:101
int call_mem_through_obj_ptr(DummyClass *dptr, mem_function_t fptr, int a, int b)
Definition: 09-functor.cpp:86
void test_call_mem()
Definition: 09-functor.cpp:91
auto endl
Definition: 09-functor.cpp:7
int(DummyClass::*)(int, int) mem_function_t
Definition: 09-functor.cpp:79
int main()
Definition: 09-functor.cpp:145
void test_functor()
Definition: 09-functor.cpp:25
void test_member_function_pointer()
Definition: 09-functor.cpp:110
int pro(int a, int b)
Definition: 09-functor.cpp:65
int sum(int a, int b)
Definition: 09-functor.cpp:60
DummyClass(int value=0)
Definition: 09-functor.cpp:57
double square(double v)
Definition: 09-functor.cpp:70
Functor(int offset)
Definition: 09-functor.cpp:16
int operator()(int a, int b) const
Definition: 09-functor.cpp:19
constexpr auto endl
Definition: tpf_output.hpp:973
Stream output operators << are implemented.