Functors (ফান্টর) বা Function Objects (ফাংশন অবজেক্টস) হলো এমন ক্লাস অবজেক্ট যেগুলোকে ফাংশনের মতো ব্যবহার করা যায়। সি++ এ, ফান্টর হলো এমন একটি ক্লাস যার মধ্যে operator() ওভারলোড করা থাকে। এই operator() ওভারলোডিংয়ের মাধ্যমে ক্লাসের অবজেক্টকে ফাংশনের মতো ব্যবহার করা সম্ভব হয়। ফান্টর সাধারণত স্টেটফুল এবং ফাংশনের মতো ব্যবহার করা যায়, যা অ্যালগরিদম এবং অন্যান্য ফাংশন থেকে কল করা যায়।
Functor এর মূল ধারণা
ফান্টর হলো এমন একটি ক্লাস অবজেক্ট যাকে ফাংশনের মতো ব্যবহার করা যায়। এটি ক্লাসের ডেটা এবং মেথডগুলোর সুবিধা নিয়ে কাজ করতে পারে, এবং সাধারণ ফাংশনের চেয়ে বেশি ক্ষমতাসম্পন্ন হতে পারে। ফান্টরের মাধ্যমে:
- স্টেটফুল অবজেক্ট তৈরি করা যায়, যেখানে স্টেট অর্থাৎ অবস্থা মেইনটেইন করা যায়।
- একই ক্লাসের বিভিন্ন অবজেক্ট বিভিন্ন ফাংশনালিটি রাখতে পারে।
- স্ট্যান্ডার্ড টেমপ্লেট লাইব্রেরি (STL) এর অ্যালগরিদমের সাথে ব্যবহৃত হতে পারে।
উদাহরণ: একটি সাধারণ Functor
#include <iostream>
class MultiplyBy {
int factor;
public:
MultiplyBy(int f) : factor(f) {} // কনস্ট্রাক্টরের মাধ্যমে ফ্যাক্টর সেট করা
int operator()(int number) const { // operator() ওভারলোড করা
return number * factor;
}
};
int main() {
MultiplyBy timesFive(5); // ৫ দ্বারা গুণনের জন্য Functor তৈরি
std::cout << "5 * 3 = " << timesFive(3) << std::endl; // আউটপুট: 15
std::cout << "5 * 4 = " << timesFive(4) << std::endl; // আউটপুট: 20
return 0;
}আউটপুট:
5 * 3 = 15
5 * 4 = 20এখানে MultiplyBy ক্লাসের অবজেক্ট timesFive একটি ফান্টর হিসেবে কাজ করছে। operator() ওভারলোডের কারণে, আমরা timesFive(3) এর মাধ্যমে 3 কে 5 এর সাথে গুণ করতে পারি।
Functor এর সুবিধা
- স্টেট সংরক্ষণ: ফান্টর ফাংশনের মতো ব্যবহার করা গেলেও, এটি তার অবস্থা বা স্টেট সংরক্ষণ করতে পারে।
- ফাংশনের চেয়ে বেশি ক্ষমতাসম্পন্ন: ফান্টরের ক্ষেত্রে ক্লাসের ডেটা মেম্বার এবং মেথডগুলোকে ব্যবহার করা যায়, যা সাধারণ ফাংশনে সম্ভব নয়।
- STL অ্যালগরিদমের সাথে সহজে ব্যবহার: STL এর অনেক অ্যালগরিদম ফান্টর ব্যবহার করতে পারে, যেমন
std::sort,std::for_eachইত্যাদি।
STL এর সাথে Functor এর ব্যবহার
STL এর অ্যালগরিদমের সাথে ফান্টর ব্যবহার করা যায়, যা বিভিন্ন অপারেশন সহজ ও দ্রুত করতে সাহায্য করে।
উদাহরণ: std::for_each এর সাথে Functor ব্যবহার
#include <iostream>
#include <vector>
#include <algorithm>
class PrintSquare {
public:
void operator()(int x) const {
std::cout << x * x << " ";
}
};
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// std::for_each এর সাথে Functor ব্যবহার
std::for_each(vec.begin(), vec.end(), PrintSquare());
return 0;
}আউটপুট:
1 4 9 16 25এখানে, PrintSquare ফান্টর std::for_each এর সাথে ব্যবহার করা হয়েছে, যা প্রতিটি উপাদানকে তার স্কোয়ারে রূপান্তর করে এবং প্রিন্ট করে।
Functor এবং Lambda Expressions এর তুলনা
সি++11 থেকে, ল্যাম্বডা এক্সপ্রেশন যোগ হওয়ার পর ফান্টরের ব্যবহার কিছুটা কমে গেছে, কারণ ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে ইনলাইন ফাংশন তৈরি করা আরও সহজ। তবে ফান্টরের কিছু বিশেষ বৈশিষ্ট্য রয়েছে:
| বৈশিষ্ট্য | Functor | Lambda Expression |
|---|---|---|
| স্টেট সংরক্ষণ | হ্যাঁ, ক্লাসের মেম্বার ভেরিয়েবলের মাধ্যমে | নির্দিষ্ট স্টেট ধারণ করতে পারে (Capture) |
| পুনঃব্যবহারযোগ্যতা | পুনঃব্যবহারযোগ্য, আলাদা আলাদা ফান্টর ক্লাস | কোডের মাঝে সংক্ষিপ্ত ব্যবহারের জন্য সুবিধাজনক |
| কোডের জটিলতা | বেশি (ক্লাস তৈরি করতে হয়) | কম (ইনলাইন লেখা যায়) |
| পারফরম্যান্স | দ্রুত, তবে বড় কোডের জন্য কম কার্যকর | ইনলাইন হওয়ার কারণে দ্রুত কার্যকর |
উপসংহার
Functors বা Function Objects হলো এমন ক্লাস অবজেক্ট যা ফাংশনের মতো ব্যবহার করা যায় এবং এতে ফাংশনের চেয়ে বেশি ক্ষমতা থাকে। STL অ্যালগরিদমের সাথে ব্যবহার এবং স্টেটফুল আচরণের কারণে ফান্টর বিভিন্ন কাজে সহায়ক। C++11 থেকে ল্যাম্বডা এক্সপ্রেশন যোগ হওয়ার পরও, ফান্টর কিছু বিশেষ পরিস্থিতিতে খুবই কার্যকর, বিশেষ করে যখন পুনঃব্যবহারযোগ্য এবং স্টেট সংরক্ষণের প্রয়োজন হয়।
Read more