Functional Objects and Functors in C++
In C++, functional objects (also known as functors) are objects that can be used as though they were a function. They are implemented by overloading the operator()
in a class or struct, enabling objects of that class to be called like a function.
What Are Functional Objects (Functors)?
A functional object is an instance of a class or struct that defines the operator()
. It can store state and behavior, making it more versatile than plain functions.
Example:
#include <iostream> using namespace std; class Adder { int value; public: Adder(int v) : value(v) {} int operator()(int x) const { return x + value; } }; int main() { Adder addFive(5); // Create a functor cout << "5 + 10 = " << addFive(10) << endl; // Use the functor return 0; }
Advantages of Functors
- They can store data as member variables.
- They allow function-like behavior with added flexibility.
- They are compatible with STL algorithms that accept callable objects.
Examples of Functors
1. Custom Functor
Here is an example of a functor that multiplies a number by a given factor:
#include <iostream> using namespace std; class Multiplier { int factor; public: Multiplier(int f) : factor(f) {} int operator()(int x) const { return x * factor; } }; int main() { Multiplier multiplyBy3(3); // Functor to multiply by 3 cout << "3 * 7 = " << multiplyBy3(7) << endl; return 0; }
2. Using Functors with STL Algorithms
Functors can be passed to STL algorithms like std::for_each
:
#include <iostream> #include <vector> #include <algorithm> using namespace std; class Print { public: void operator()(int x) const { cout << x << " "; } }; int main() { vectornumbers = {1, 2, 3, 4, 5}; for_each(numbers.begin(), numbers.end(), Print()); // Use functor return 0; }
3. Functor with State
A functor can maintain internal state to track data:
#include <iostream> #include <vector> #include <algorithm> using namespace std; class Counter { int count; public: Counter() : count(0) {} void operator()(int x) { if (x % 2 == 0) { count++; } } int getCount() const { return count; } }; int main() { vectornumbers = {1, 2, 3, 4, 5, 6}; Counter counter = for_each(numbers.begin(), numbers.end(), Counter()); cout << "Number of even numbers: " << counter.getCount() << endl; return 0; }
4. Predefined Functors in STL
C++ provides predefined functors in the <functional>
header, such as plus
, minus
, multiplies
, and greater
:
#include <iostream> #include <functional> using namespace std; int main() { plusadd; cout << "10 + 20 = " << add(10, 20) << endl; greater compare; cout << "Is 10 greater than 5? " << (compare(10, 5) ? "Yes" : "No") << endl; return 0; }
Conclusion
Functors in C++ provide a powerful way to define callable objects with state and behavior. They are widely used with STL algorithms to enhance flexibility and make the code more modular and reusable.