C++ std: যেকোনো উদাহরণ

C Std Yekono Udaharana



C++ প্রোগ্রামিং-এ, স্ট্যান্ডার্ড টেমপ্লেট লাইব্রেরি (STL) থেকে 'std::any' একটি ভিন্নধর্মী ডেটা পরিচালনা করার জন্য একটি গতিশীল টাইপিং প্রবর্তন করে। প্রথাগত কন্টেইনারগুলির বিপরীতে, 'std::any' একটি একক কন্টেইনারের মধ্যে যেকোন ধরণের মান সংরক্ষণ করতে দেয়, এমন পরিস্থিতিতে নমনীয়তা বাড়ায় যেখানে ডেটা প্রকারগুলি অজানা বা রানটাইমে পরিবর্তিত হয়৷ এই টাইপ-অজ্ঞেয়বাদী পদ্ধতি একটি জেনেরিক প্রোগ্রামিংকে প্রচার করে যা বিকাশকারীদের টাইপ নিরাপত্তা বজায় রেখে আরও অভিযোজিত এবং অভিব্যক্তিপূর্ণ কোড তৈরি করার ক্ষমতা দেয়। এই অন্বেষণে, আমরা 'std::any' এর বৈশিষ্ট্যগুলি, এর ব্যবহারের ধরণগুলি এবং ব্যবহারিক উদাহরণগুলি নিয়ে আলোচনা করব যা একটি শক্তিশালী এবং নমনীয় C++ কোড লেখার ক্ষেত্রে এর ভূমিকাকে চিত্রিত করে৷

উদাহরণ 1: Std::Any এর মৌলিক ব্যবহার

প্রথমে, 'std::any' এর মৌলিক ব্যবহার প্রদর্শনের জন্য একটি সরল উদাহরণ অন্বেষণ করা যাক। একটি দৃশ্যকল্প বিবেচনা করুন যেখানে আপনার বিভিন্ন ধরণের পরামিতি গ্রহণ করার জন্য একটি ফাংশন প্রয়োজন:







এখানে কোড স্নিপেট আছে:



# অন্তর্ভুক্ত করুন
#অন্তর্ভুক্ত <কোনও>

অকার্যকর প্রক্রিয়াযেকোন ( const std:: any এবং মান ) {
যদি ( value.has_value ( ) ) {
std::cout << 'সঞ্চিত মানের প্রকার:' << value.type ( ) নাম ( ) << std::endl;

যদি ( value.type ( ) == টাইপড ( int ) ) {
std::cout << 'মান:' << std::any_cast < int > ( মান ) << std::endl;
} অন্য যদি ( value.type ( ) == টাইপড ( দ্বিগুণ ) ) {
std::cout << 'মান:' << std::any_cast < দ্বিগুণ > ( মান ) << std::endl;
} অন্য যদি ( value.type ( ) == টাইপড ( std::স্ট্রিং ) ) {
std::cout << 'মান:' << std::any_cast < std::স্ট্রিং > ( মান ) << std::endl;
} অন্য {
std::cout << 'অসমর্থিত প্রকার!' << std::endl;
}
} অন্য {
std::cout << 'std::any তে কোনো মান সংরক্ষিত নেই।' << std::endl;
}
}

int প্রধান ( ) {
প্রক্রিয়া যে কোন ( 42 ) ;
প্রক্রিয়া যে কোন ( 3.14 ) ;
প্রক্রিয়া যে কোন ( std::স্ট্রিং ( 'হ্যালো, std:: any!' ) ) ;
প্রক্রিয়া যে কোন ( 4.5f ) ; // অসমর্থিত টাইপ

ফিরে 0 ;
}


এই উদাহরণে, আমরা 'processAny' ফাংশনটিকে সংজ্ঞায়িত করি যা একটি প্যারামিটার হিসাবে একটি 'std::any' রেফারেন্স নেয় এবং এর বিষয়বস্তু পরীক্ষা করে। ফাংশনের ভিতরে, আমরা প্রথমে has_value() ব্যবহার করে 'std::any' ভেরিয়েবলের একটি সংরক্ষিত মান আছে কিনা তা পরীক্ষা করি। যদি একটি মান উপস্থিত থাকে, আমরা type().name() ব্যবহার করে সংরক্ষিত মানটির ধরন নির্ধারণ করি এবং এর প্রকারের উপর ভিত্তি করে সংশ্লিষ্ট মানটি মুদ্রণ করতে এগিয়ে যাই। প্রধান ফাংশন তারপর 'processAny' এর উপযোগিতা প্রদর্শন করে বিভিন্ন প্রকারের সাথে কল করে: একটি পূর্ণসংখ্যা (42), একটি দ্বিগুণ (3.14), এবং একটি স্ট্রিং (“Hello, std::any!”)। ফাংশনটি যথাযথভাবে প্রতিটি প্রকার পরিচালনা করে এবং সংশ্লিষ্ট মানগুলি প্রিন্ট করে। যাইহোক, যখন একটি ফ্লোটিং-পয়েন্ট নম্বর (4.5f) প্রক্রিয়া করার চেষ্টা করা হয়, যা এই উদাহরণে অসমর্থিত, প্রোগ্রামটি টাইপটি অসমর্থিত তা ইঙ্গিত করে পরিস্থিতি সুন্দরভাবে পরিচালনা করে।



উৎপন্ন আউটপুট হল:






এটি দেখায় কিভাবে 'std::any' বিভিন্ন ধরনের ডেটার গতিশীল হ্যান্ডলিং সক্ষম করে, এটিকে C++ এ জেনেরিক প্রোগ্রামিংয়ের জন্য একটি বহুমুখী হাতিয়ার করে তোলে।

উদাহরণ 2: ব্যবহারকারী-সংজ্ঞায়িত প্রকার সংরক্ষণ করা

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



এখানে কোড আছে:

# অন্তর্ভুক্ত করুন
#অন্তর্ভুক্ত <কোনও>

ক্লাস মাইক্লাস {
সর্বজনীন:
আমার ক্লাস ( int মান ) : তথ্য ( মান ) { }

অকার্যকর প্রিন্ট ডেটা ( ) const {
std::cout << 'মাইক্লাসে ডেটা:' << তথ্য << std::endl;
}

ব্যক্তিগত:
int ডেটা;
} ;

int প্রধান ( ) {
std:: any anyObject = MyClass ( 42 ) ;

যদি ( anyObject.has_value ( ) ) {
স্বয়ংক্রিয় এবং myClassInstance = std::any_cast < আমার ক্লাস &> ( যেকোনো বস্তু ) ;
myClassInstance.printData ( ) ;
} অন্য {
std::cout << 'std::any তে কোনো মান সংরক্ষিত নেই।' << std::endl;
}

ফিরে 0 ;
}


এই C++ কোড স্নিপেটে, আমরা 'MyClass' নামক ব্যবহারকারী-নির্ধারিত ক্লাসের সাথে 'std::any' টাইপ ব্যবহার করে ব্যাখ্যা করার জন্য একটি সাধারণ উদাহরণ তৈরি করি। ক্লাসের মধ্যে, এই ডেটার মান প্রদর্শন করার জন্য 'ডেটা' নামে একটি ব্যক্তিগত সদস্য ভেরিয়েবল এবং printData() নামে একটি পাবলিক পদ্ধতি রয়েছে। একটি পূর্ণসংখ্যা মান পাস করা হয় এবং কনস্ট্রাক্টরের 'ডেটা' সদস্যকে বরাদ্দ করা হয়।

'প্রধান' ফাংশনে, আমরা 42 এর প্রাথমিক মান সহ 'MyClass' এর একটি অবজেক্টকে ইনস্ট্যান্টিয়েট করি এবং তারপরে এটিকে 'std::any' ভেরিয়েবলে 'anyObject' নামে সংরক্ষণ করি। এটি ব্যবহারকারী-সংজ্ঞায়িত ক্লাসের উদাহরণ ধারণ করার জন্য 'std::any' এর ক্ষমতা প্রদর্শন করে।

এটি অনুসরণ করে, has_value() পদ্ধতি ব্যবহার করে 'anyObject' এর একটি মান আছে কিনা তা পরীক্ষা করতে আমরা একটি 'if' স্টেটমেন্ট ব্যবহার করি। যদি একটি মান থাকে, আমরা 'std::any_cast' ব্যবহার করে সঞ্চিত বস্তুটি পুনরুদ্ধার করি। 'std::any_cast' ব্যবহার করা হয় 'MyClass&' টেমপ্লেট আর্গুমেন্টের সাথে সঞ্চিত বস্তুটিকে 'MyClass' এর রেফারেন্সে কাস্ট করার জন্য। এই রেফারেন্স, “myClassInstance”, তারপর printData() পদ্ধতিতে কল করার জন্য ব্যবহৃত হয়, যা “std::any”-এর মধ্যে সংরক্ষিত ব্যবহারকারী-সংজ্ঞায়িত টাইপ অ্যাক্সেস এবং পরিচালনা করার ক্ষমতা প্রদর্শন করে।

যদি 'std::any'-এ কোনো মান সংরক্ষিত না থাকে, তাহলে আমরা এটি নির্দেশ করে একটি বার্তা প্রিন্ট করি। এই শর্তসাপেক্ষ চেক নিশ্চিত করে যে আমরা পরিস্থিতিগুলি পরিচালনা করি যেখানে 'std::any' ভেরিয়েবল খালি থাকতে পারে।

এখানে আউটপুট আছে:

উদাহরণ 3: মিশ্র ধরনের ধারক

প্রোগ্রামিং-এ, একটি 'মিশ্র-ধরনের ধারক' একটি ডেটা কাঠামোকে বোঝায় যা বিভিন্ন, সম্ভাব্য সম্পর্কহীন ডেটা প্রকারের উপাদানগুলিকে ধরে রাখতে সক্ষম। এই নমনীয়তা মূল্যবান যখন এমন পরিস্থিতিতে মোকাবেলা করার সময় যেখানে ডেটা প্রকারগুলি কম্পাইলের সময় অজানা থাকে বা প্রোগ্রাম নির্বাহের সময় গতিশীলভাবে পরিবর্তন হয়। C++-এ, “std::any” এই ধারণার উদাহরণ দেয়, একটি একক ধারক তৈরির মাধ্যমে বিভিন্ন ধরনের মান সংরক্ষণ করা যায়।

আসুন একটি দৃশ্যকল্প অন্বেষণ করি যেখানে আমরা একটি পাত্র তৈরি করি যা বিভিন্ন প্রকার ধারণ করে:

# অন্তর্ভুক্ত করুন
#অন্তর্ভুক্ত <কোনও>
# অন্তর্ভুক্ত <ভেক্টর>

int প্রধান ( ) {

std:: ভেক্টর < std::যেকোনো > মিশ্র কন্টেইনার;

mixedContainer.push_back ( 42 ) ;
mixedContainer.push_back ( 3.14 ) ;
mixedContainer.push_back ( std::স্ট্রিং ( 'হ্যালো' ) ) ;
mixedContainer.push_back ( সত্য ) ;

জন্য ( const স্বয়ংক্রিয় এবং উপাদান: মিশ্র কন্টেইনার ) {
যদি ( element.type ( ) == টাইপড ( int ) ) {
std::cout << 'পূর্ণসংখ্যা:' << std::any_cast < int > ( উপাদান ) << std::endl;
} অন্য যদি ( element.type ( ) == টাইপড ( দ্বিগুণ ) ) {
std::cout << 'ডবল:' << std::any_cast < দ্বিগুণ > ( উপাদান ) << std::endl;
} অন্য যদি ( element.type ( ) == টাইপড ( std::স্ট্রিং ) ) {
std::cout << 'স্ট্রিং:' << std::any_cast < std::স্ট্রিং > ( উপাদান ) << std::endl;
} অন্য যদি ( element.type ( ) == টাইপড ( bool ) ) {
std::cout << 'বুলিয়ান:' << std::any_cast < bool > ( উপাদান ) << std::endl;
} অন্য {
std::cout << 'অজানা প্রকার' << std::endl;
}
}

ফিরে 0 ;
}


এই দৃষ্টান্তে, আমরা C++ এবং 'std::any' বৈশিষ্ট্য ব্যবহার করে একটি মিশ্র-প্রকার পাত্রের ধারণা প্রদর্শন করি। আমরা বিভিন্ন ডেটা প্রকারের উপাদানগুলিকে ধরে রাখতে আমাদের কন্টেইনার হিসাবে পরিবেশন করার জন্য 'std::vector' নামক 'mixedContainer' তৈরি করি। 'পুশ_ব্যাক' ফাংশন ব্যবহার করে, আমরা একটি পূর্ণসংখ্যা (42), একটি দ্বিগুণ (3.14), একটি স্ট্রিং ('হ্যালো'), এবং একটি বুলিয়ান (সত্য) সহ বিভিন্ন উপাদান দিয়ে এই কন্টেইনারটি তৈরি করি।

যেহেতু আমরা একটি 'ফর' লুপ ব্যবহার করে 'মিশ্র কন্টেইনার' এর মাধ্যমে পুনরাবৃত্তি করি, আমরা প্রতিটি উপাদানের ডাটা টাইপকে গতিশীলভাবে সনাক্ত করতে টাইপ() ফাংশন ব্যবহার করি। 'std::any_cast' ব্যবহার করে, আমরা তাদের প্রকারের উপর ভিত্তি করে সংশ্লিষ্ট মানগুলি বের করে প্রিন্ট করি। উদাহরণস্বরূপ, যদি উপাদানটি 'int' টাইপের হয় তবে আমরা এটিকে পূর্ণসংখ্যা হিসাবে প্রিন্ট করি। যদি এটি 'ডবল' টাইপের হয়, আমরা এটিকে ডাবল হিসাবে মুদ্রণ করি এবং আরও অনেক কিছু।

এখানে উত্পন্ন আউটপুট আছে:

উদাহরণ 4: Std::Any এর সাথে ত্রুটি হ্যান্ডলিং

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

# অন্তর্ভুক্ত করুন
#অন্তর্ভুক্ত <কোনও>

int প্রধান ( ) {
std:: any myAny = 42 ;

চেষ্টা করুন {

দ্বিগুণ মান = std::any_cast < দ্বিগুণ > ( myAny ) ;
std::cout << 'মান:' << মান << std::endl;
} ধরা ( const std::bad_any_cast এবং এইটা ) {

std::cerr << 'ত্রুটি: ' << e.কি ( ) << std::endl;
}

ফিরে 0 ;
}


আমরা শুরু করি 'std::any' ভেরিয়েবল, 'myAny', পূর্ণসংখ্যার প্রকারের 42 এর মান সহ। পরবর্তী 'ট্রাই' ব্লকের ভিতরে, আমরা 'std::any_cast' অপারেশন ব্যবহার করে এই পূর্ণসংখ্যার মানটিকে 'ডবল'-এ কাস্ট করার একটি সুস্পষ্ট চেষ্টা করি। যাইহোক, যেহেতু 'myAny' তে সংরক্ষিত প্রকৃত প্রকারটি একটি পূর্ণসংখ্যা, তাই এই কাস্টিং অপারেশনটি একটি 'ডাবল' এর জন্য অবৈধ যা একটি অমিল টাইপের দিকে নিয়ে যায়৷

এই সম্ভাব্য ত্রুটিটি সুন্দরভাবে পরিচালনা করতে, আমরা একটি 'ক্যাচ' ব্লকের সাথে ব্যতিক্রম হ্যান্ডলিং বাস্তবায়ন করি যা 'std::bad_any_cast' এর নির্দিষ্ট ব্যতিক্রম ধরতে ডিজাইন করা হয়েছে। একটি ব্যর্থ কাস্টের ক্ষেত্রে, 'ক্যাচ' ব্লক সক্রিয় করা হয় এবং আমরা ত্রুটির প্রকৃতির সাথে যোগাযোগ করতে 'std::cerr' ব্যবহার করে একটি ত্রুটি বার্তা তৈরি করি। এই ত্রুটি-হ্যান্ডলিং কৌশলটি নিশ্চিত করে যে আমাদের প্রোগ্রামটি সেই পরিস্থিতিগুলিকে সুন্দরভাবে পরিচালনা করতে পারে যেখানে চেষ্টা করা টাইপ কাস্টের প্রকৃত প্রকারের সাথে সংঘর্ষ হয় যা 'std::any' ভেরিয়েবলে সংরক্ষিত হয়।

উপসংহার

এই নিবন্ধে, আমরা C++-এ “std::any”-এর অ্যাপ্লিকেশনগুলি অন্বেষণ করেছি, একটি গতিশীল টাইপ কন্টেইনার যা C++-এ বিভিন্ন ধরনের মানগুলির জন্য চালু করা হয়েছে। আমরা বিভিন্ন উদাহরণের মাধ্যমে এর বহুমুখীতা প্রদর্শন করেছি, মৌলিক ব্যবহার থেকে শুরু করে ব্যবহারকারী-সংজ্ঞায়িত প্রকার এবং ভিন্নধর্মী সংগ্রহগুলি পরিচালনা করা পর্যন্ত পরিস্থিতিগুলি প্রদর্শন করে। আমরা এমন পরিস্থিতিতে এর ব্যবহারিক প্রয়োগ প্রদর্শন করেছি যেখানে কম্পাইলের সময় ডেটার ধরন জানা যায় না। উপরন্তু, আমরা ত্রুটি-হ্যান্ডলিং কৌশল সম্পর্কে অন্বেষণ করেছি, ব্যতিক্রম পরিচালনার মাধ্যমে অসমর্থিত প্রকারগুলিকে সুন্দরভাবে পরিচালনা করার গুরুত্বের উপর জোর দিয়েছি।