std::function এর ব্যবহার এবং প্রয়োগ

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

302

std::function C++11 এ যোগ করা একটি ফাংশনালিটি যা একটি ফাংশন পয়েন্টার, ল্যাম্বডা এক্সপ্রেশন, অথবা ফাংশন অবজেক্ট ধারণ করতে পারে এবং সেগুলোকে সমানভাবে ব্যবহার করতে সহায়ক। এটি C++ তে হাইব্রিড ফাংশন পয়েন্টার তৈরি করতে সহায়ক এবং বিভিন্ন ধরনের ফাংশনকে একত্রে পরিচালনা করার জন্য ব্যবহার করা হয়।

std::function এমন একটি ক্লাস টেমপ্লেট যা একটি নির্দিষ্ট সিগনেচার (ফাংশনের ইনপুট এবং আউটপুট টাইপ) মেনে ফাংশন পয়েন্টারগুলিকে স্টোর করতে সক্ষম। এটি বিশেষভাবে দরকারী যেখানে ফাংশন পয়েন্টারগুলি ডাইনামিকভাবে পরিবর্তিত হতে পারে, বা ফাংশন এক্সপ্রেশনগুলি এক্সিকিউট করা প্রয়োজন।

১. std::function এর মূল বৈশিষ্ট্য

  • হাইব্রিড ফাংশন পয়েন্টার: এটি ফাংশন পয়েন্টার, ফাংশন অবজেক্ট, এবং ল্যাম্বডা এক্সপ্রেশনকে একত্রে পরিচালনা করতে পারে।
  • টাইপ নিরাপত্তা: এটি নির্দিষ্ট টাইপের সাথে কাজ করে, অর্থাৎ ফাংশনের আর্গুমেন্ট এবং রিটার্ন টাইপের সাথে মেলে এমন ফাংশন শুধুমাত্র রাখা যাবে।
  • কোনো নির্দিষ্ট ফাংশন প্রকার প্রয়োজন নেই, আপনি একাধিক ধরনের ফাংশন বা ল্যাম্বডা এক্সপ্রেশনও সংরক্ষণ করতে পারেন।

২. std::function এর Syntax

#include <functional>

std::function<ReturnType(ArgTypes...)> func;

এখানে:

  • ReturnType: ফাংশনের রিটার্ন টাইপ।
  • ArgTypes: ফাংশনের ইনপুট প্যারামিটার টাইপগুলি।

৩. std::function এর উদাহরণ

উদাহরণ ১: ফাংশন পয়েন্টার হিসাবে std::function

#include <iostream>
#include <functional>

// একটি সাধারণ ফাংশন যা দুটি ইন্টিজার ইনপুট নিয়ে তাদের যোগফল প্রদান করবে
int add(int a, int b) {
    return a + b;
}

int main() {
    // std::function দ্বারা add ফাংশন স্টোর করা
    std::function<int(int, int)> func = add;

    // func ব্যবহার করে add ফাংশন কল করা
    int result = func(5, 3);
    std::cout << "Result: " << result << std::endl;

    return 0;
}

আউটপুট:

Result: 8

এখানে, std::function<int(int, int)> ব্যবহার করে আমরা add ফাংশনটি একটি ফাংশন পয়েন্টারের মতো স্টোর করেছি এবং পরে func(5, 3) ব্যবহার করে ফাংশনটি কল করেছি।

উদাহরণ ২: ল্যাম্বডা এক্সপ্রেশন ব্যবহার

#include <iostream>
#include <functional>

int main() {
    // std::function ব্যবহার করে একটি ল্যাম্বডা ফাংশন স্টোর করা
    std::function<int(int, int)> func = [](int a, int b) { return a * b; };

    // ল্যাম্বডা ফাংশন কল করা
    int result = func(4, 5);
    std::cout << "Result: " << result << std::endl;

    return 0;
}

আউটপুট:

Result: 20

এখানে, আমরা একটি ল্যাম্বডা এক্সপ্রেশন [](int a, int b) { return a * b; } ব্যবহার করে std::function তে সংরক্ষণ করেছি এবং এটি পরে কল করেছি।

উদাহরণ ৩: ফাংশন অবজেক্ট ব্যবহার

#include <iostream>
#include <functional>

// ফাংশন অবজেক্টের একটি ক্লাস
class Multiply {
public:
    int operator()(int a, int b) {
        return a * b;
    }
};

int main() {
    // ফাংশন অবজেক্ট `Multiply` ক্লাসের অবজেক্ট তৈরি
    std::function<int(int, int)> func = Multiply();

    // ফাংশন অবজেক্ট কল করা
    int result = func(6, 7);
    std::cout << "Result: " << result << std::endl;

    return 0;
}

আউটপুট:

Result: 42

এখানে, Multiply ক্লাসটি একটি ফাংশন অবজেক্ট এবং এটি std::function দ্বারা কল করা হয়েছে।


৪. std::function এর সুবিধা

  1. হাইব্রিড প্রোগ্রামিং: এটি ফাংশন পয়েন্টার, ফাংশন অবজেক্ট এবং ল্যাম্বডাকে একত্রিত করতে পারে, যা আরও নমনীয় এবং শক্তিশালী কোড লেখার সুযোগ প্রদান করে।
  2. টাইপ সেফটি: std::function টাইপ নিরাপত্তা প্রদান করে, অর্থাৎ আপনি কেবল সঠিক ধরনের ফাংশন বা এক্সপ্রেশনই এতে সংরক্ষণ করতে পারবেন।
  3. ডাইনামিক ফাংশন নির্বাচন: এটি ডাইনামিকভাবে ফাংশন নির্বাচন করতে সহায়ক, যেমন কলব্যাক ফাংশন বা বিভিন্ন ইভেন্ট হ্যান্ডলিং সিস্টেমে ব্যবহৃত হতে পারে।

৫. কিছু গুরুত্বপূর্ণ ফিচার

  • std::function এর পোর্টেবিলিটি: এটি C++ এর সব প্ল্যাটফর্মে কাজ করে এবং ফাংশনাল প্রোগ্রামিংয়ের সুবিধা প্রদান করে।
  • ডাইনামিক টাইপিং: std::function যে কোনও ফাংশন, ল্যাম্বডা বা ফাংশন অবজেক্ট ধারণ করতে পারে, এবং এগুলোকে একযোগে ব্যবহার করা যায়।
  • ডেক্লারেশন এবং ব্যবহার সহজ: std::function ফাংশন, ল্যাম্বডা, এবং ফাংশন অবজেক্টকে একটি সাধারণ এবং সহজ সাইনেচারে সংজ্ঞায়িত করতে সাহায্য করে।

৬. পারফরম্যান্স এবং সীমাবদ্ধতা

  • std::function সাধারণত ফাংশন পয়েন্টারের তুলনায় কিছুটা ধীর হতে পারে কারণ এটি একাধিক ধরনের অবজেক্টকে হ্যান্ডেল করতে পারে এবং ডাইনামিক মেমরি ব্যবহারের জন্য অতিরিক্ত ওভারহেড থাকতে পারে।
  • যখন আপনি খুব দ্রুত পারফরম্যান্স চান এবং জানেন যে আপনার ফাংশনটি একটি নির্দিষ্ট টাইপের হবে, তখন ফাংশন পয়েন্টার বা ফাংশন অবজেক্ট ব্যবহার করা বেশি উপযুক্ত হতে পারে।

উপসংহার

std::function C++ এর একটি শক্তিশালী এবং নমনীয় বৈশিষ্ট্য যা ফাংশন পয়েন্টার, ফাংশন অবজেক্ট, এবং ল্যাম্বডাকে একত্রে ব্যবহারের সুযোগ দেয়। এটি কোডের পুনরাবৃত্তি হ্রাস করে এবং ডাইনামিক ফাংশন নির্বাচন, কলব্যাক মেকানিজম, এবং অন্যান্য পরিস্থিতিতে কার্যকরী প্রোগ্রামিংয়ে সহায়ক হতে পারে।

Content added By
Promotion

Are you sure to start over?

Loading...