Functors এবং Function Objects এর ধারণা

Function Objects এবং Lambdas (ফাংশন অবজেক্টস এবং ল্যাম্বডা এক্সপ্রেশন) - সি++ স্ট্যান্ডার্ড লাইব্রেরি (C++ Standard Library) - Computer Programming

360

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 থেকে, ল্যাম্বডা এক্সপ্রেশন যোগ হওয়ার পর ফান্টরের ব্যবহার কিছুটা কমে গেছে, কারণ ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে ইনলাইন ফাংশন তৈরি করা আরও সহজ। তবে ফান্টরের কিছু বিশেষ বৈশিষ্ট্য রয়েছে:

বৈশিষ্ট্যFunctorLambda Expression
স্টেট সংরক্ষণহ্যাঁ, ক্লাসের মেম্বার ভেরিয়েবলের মাধ্যমেনির্দিষ্ট স্টেট ধারণ করতে পারে (Capture)
পুনঃব্যবহারযোগ্যতাপুনঃব্যবহারযোগ্য, আলাদা আলাদা ফান্টর ক্লাসকোডের মাঝে সংক্ষিপ্ত ব্যবহারের জন্য সুবিধাজনক
কোডের জটিলতাবেশি (ক্লাস তৈরি করতে হয়)কম (ইনলাইন লেখা যায়)
পারফরম্যান্সদ্রুত, তবে বড় কোডের জন্য কম কার্যকরইনলাইন হওয়ার কারণে দ্রুত কার্যকর

উপসংহার

Functors বা Function Objects হলো এমন ক্লাস অবজেক্ট যা ফাংশনের মতো ব্যবহার করা যায় এবং এতে ফাংশনের চেয়ে বেশি ক্ষমতা থাকে। STL অ্যালগরিদমের সাথে ব্যবহার এবং স্টেটফুল আচরণের কারণে ফান্টর বিভিন্ন কাজে সহায়ক। C++11 থেকে ল্যাম্বডা এক্সপ্রেশন যোগ হওয়ার পরও, ফান্টর কিছু বিশেষ পরিস্থিতিতে খুবই কার্যকর, বিশেষ করে যখন পুনঃব্যবহারযোগ্য এবং স্টেট সংরক্ষণের প্রয়োজন হয়।

Content added By
Promotion

Are you sure to start over?

Loading...