std::any, std::variant, এবং std::optional এর ব্যবহার

Utility Libraries (ইউটিলিটি লাইব্রেরি) - সি++ স্ট্যান্ডার্ড লাইব্রেরি (C++ Standard Library) - Computer Programming

333

C++11 এবং পরবর্তী সংস্করণে, C++ স্ট্যান্ডার্ড লাইব্রেরিতে নতুন কিছু টেমপ্লেট ক্লাস যোগ করা হয়েছে যা ডেটা ম্যানিপুলেশনকে আরও সহজ এবং নিরাপদ করেছে। এগুলোর মধ্যে std::any, std::variant, এবং std::optional অন্তর্ভুক্ত। এই ক্লাসগুলো ব্যবহারকারীদের অনেক ধরনের ডেটা ও তাদের অবস্থা পরিচালনা করতে সাহায্য করে।

এখানে এই তিনটি ক্লাসের ব্যবহার এবং তাদের মূল বৈশিষ্ট্যগুলো আলোচনা করা হলো:


১. std::any

std::any একটি নতুন ডেটা টাইপ যা C++17 এ অন্তর্ভুক্ত করা হয়েছে এবং এটি যে কোনও টাইপের মান ধারণ করতে পারে। এটি একটি "type-safe container" যেখানে আপনি যে কোনও ধরনের ডেটা (যেমন, int, double, std::string, ইত্যাদি) সংরক্ষণ করতে পারেন। std::any ব্যবহার করার সময় আপনাকে ডেটা টাইপটি জানার প্রয়োজন হয় না, তবে এর জন্য কিছু ফাংশন রয়েছে যার মাধ্যমে আপনি ডেটা টাইপের তথ্য পেতে পারেন এবং টাইপকে নিরাপদে ব্যবহার করতে পারেন।

উদাহরণ (std::any):

#include <iostream>
#include <any>
#include <string>

int main() {
    std::any data;

    // বিভিন্ন টাইপের ডেটা `std::any` তে সংরক্ষণ
    data = 10;  // integer
    std::cout << "Integer: " << std::any_cast<int>(data) << std::endl;

    data = 3.14;  // double
    std::cout << "Double: " << std::any_cast<double>(data) << std::endl;

    data = std::string("Hello, World!");  // string
    std::cout << "String: " << std::any_cast<std::string>(data) << std::endl;

    return 0;
}

আউটপুট:

Integer: 10
Double: 3.14
String: Hello, World!

এখানে, std::any int, double, এবং std::string এর মান ধারণ করেছে। আপনি যখন std::any_cast<T>() ফাংশন ব্যবহার করবেন, তখন আপনাকে টাইপটি সঠিকভাবে জানাতে হবে, অথবা এটি একটি std::bad_any_cast ত্রুটি দেবে।


২. std::variant

std::variant একটি সি++17 বৈশিষ্ট্য যা একই সময়ে একাধিক প্রকারের মান ধারণ করতে পারে। এটি একটি সুরক্ষিত ইউনিয়ন (type-safe union) যা একটি সময়ে কেবল একটি মান ধারণ করে এবং আপনি জানেন কোন টাইপটি বর্তমানে ব্যবহৃত হচ্ছে। std::variant ডেটা টাইপের নিরাপত্তা প্রদান করে এবং টাইপ চেকের জন্য কিছু ফাংশন সরবরাহ করে।

উদাহরণ (std::variant):

#include <iostream>
#include <variant>

int main() {
    std::variant<int, float, std::string> var;

    // int সেট করা
    var = 10;
    std::cout << "Integer: " << std::get<int>(var) << std::endl;

    // float সেট করা
    var = 3.14f;
    std::cout << "Float: " << std::get<float>(var) << std::endl;

    // string সেট করা
    var = "Hello, Variant!";
    std::cout << "String: " << std::get<std::string>(var) << std::endl;

    return 0;
}

আউটপুট:

Integer: 10
Float: 3.14
String: Hello, Variant!

এখানে, std::variant একটি int, float, বা std::string ধারণ করতে পারে, কিন্তু প্রতিবার কেবল একটি টাইপের মান থাকতে পারে। আপনি std::get<T>() ব্যবহার করে সঠিক টাইপ থেকে মান পেতে পারেন। যদি আপনি ভুল টাইপে অ্যাক্সেস করার চেষ্টা করেন, তাহলে এটি একটি std::bad_variant_access ত্রুটি ছুঁড়ে ফেলবে।


৩. std::optional

std::optional একটি C++17 বৈশিষ্ট্য যা একটি মানের উপস্থিতি বা অনুপস্থিতি নির্দেশ করতে ব্যবহৃত হয়। এটি বিশেষভাবে দরকারী যখন আপনি এমন একটি মান ধারণ করতে চান যা অপশনাল বা ঐচ্ছিক, যেমন ডেটাবেসের ফলাফল বা ইউজার ইনপুট যেখানে মানটি প্রযোজ্য নাও হতে পারে। এটি সাধারণত null বা "no value" পরিস্থিতি পরিচালনা করতে ব্যবহৃত হয়, তবে std::nullopt ব্যবহার করে এটি নির্দেশ করা হয়।

উদাহরণ (std::optional):

#include <iostream>
#include <optional>

std::optional<int> divide(int a, int b) {
    if (b == 0) {
        return std::nullopt;  // Division by zero, return no value
    }
    return a / b;  // Return the result
}

int main() {
    auto result = divide(10, 2);

    if (result) {
        std::cout << "Result: " << *result << std::endl;
    } else {
        std::cout << "Division by zero!" << std::endl;
    }

    result = divide(10, 0);
    if (result) {
        std::cout << "Result: " << *result << std::endl;
    } else {
        std::cout << "Division by zero!" << std::endl;
    }

    return 0;
}

আউটপুট:

Result: 5
Division by zero!

এখানে, std::optional<int> একটি অপশনাল মান ধারণ করে। যদি ভাগফল সম্ভব না হয় (যেমন ভাগফল শূন্যের সাথে), তাহলে std::nullopt ব্যবহার করে কোনো মান ফেরত দেওয়া হয় না। আপনি *result দিয়ে ঐচ্ছিক মানটি বের করতে পারেন, তবে আপনি আগে নিশ্চিত করতে হবে যে মানটি উপস্থিত রয়েছে।


সারাংশ

  • std::any: যে কোন টাইপের মান ধারণ করতে পারে। এটি টাইপ নিরাপত্তা প্রদান করে এবং টাইপ কাস্টিং করতে পারে।
  • std::variant: একাধিক সম্ভাব্য টাইপের মধ্যে একটি টাইপ ধারণ করতে পারে। এটি টাইপ নিরাপত্তা প্রদান করে এবং কেবলমাত্র একটি টাইপ ধারণ করতে দেয়।
  • std::optional: একটি অপশনাল মান ধারণ করতে পারে, যা একটি মানের উপস্থিতি বা অনুপস্থিতি নির্দেশ করে। এটি সাধারণত nullopt ব্যবহার করে মানের অনুপস্থিতি নির্দেশ করে।

এই তিনটি ক্লাস C++ প্রোগ্রামিংয়ে টাইপ নিরাপত্তা, অপশনাল ডেটা, এবং বহুমুখী টাইপ ব্যবহারের সুবিধা প্রদান করে।

Content added By
Promotion

Are you sure to start over?

Loading...