স্ট্যাটিক_কাস্ট এবং পুনরায় ব্যাখ্যা_কাস্ট উভয়ই অন্য পয়েন্টার টাইপের শূন্য * castালাইয়ের জন্য দুর্দান্ত কাজ করছে বলে মনে হচ্ছে। একে অপরের প্রতি পক্ষপাতিত্ব করার কোনও উপযুক্ত কারণ আছে কি?
স্ট্যাটিক_কাস্ট এবং পুনরায় ব্যাখ্যা_কাস্ট উভয়ই অন্য পয়েন্টার টাইপের শূন্য * castালাইয়ের জন্য দুর্দান্ত কাজ করছে বলে মনে হচ্ছে। একে অপরের প্রতি পক্ষপাতিত্ব করার কোনও উপযুক্ত কারণ আছে কি?
উত্তর:
ব্যবহার করুনstatic_cast
: এটি সংকীর্ণ নিক্ষিপ্ত যা এখানে রূপান্তরটি কী হবে তা হুবহু বর্ণনা করে।
একটি ভুল ধারণা রয়েছে যে ব্যবহার reinterpret_cast
করা আরও ভাল মিল হবে কারণ এর অর্থ "সম্পূর্ণরূপে সুরক্ষা উপেক্ষা করুন এবং কেবল এ থেকে বি তে নিক্ষিপ্ত"।
তবে এটি আসলে ক এর প্রভাব বর্ণনা করে না reinterpret_cast
। পরিবর্তে, reinterpret_cast
এর বেশ কয়েকটি অর্থ রয়েছে, যার সবক'টিই বলে যে "দ্বারা সম্পাদিত ম্যাপিংটি reinterpret_cast
বাস্তবায়ন-সংজ্ঞায়িত।" [5.2.10.3]
কিন্তু থেকে কাস্ট নির্দিষ্ট ক্ষেত্রে void*
করতে T*
ম্যাপিং সম্পূর্ণরূপে মান দ্বারা উত্তমরুপে সংজ্ঞায়িত হয়; যথা, এর ঠিকানা পরিবর্তন না করেই টাইপলেস পয়েন্টারে কোনও টাইপ বরাদ্দ করা।
এই পছন্দ একটি কারণ static_cast
।
অতিরিক্তভাবে এবং তাত্ক্ষণিকভাবে আরও গুরুত্বপূর্ণ, এটি হ'ল প্রতিটি ব্যবহার নিখুঁতভাবে reinterpret_cast
বিপজ্জনক কারণ এটি অন্য যে কোনও কিছুকে সত্যই (পয়েন্টারগুলির জন্য) রূপান্তরিত করে, যদিও static_cast
এটি আরও বেশি সীমাবদ্ধ, সুতরাং এটি আরও ভাল স্তরের সুরক্ষা সরবরাহ করে। এটি ইতিমধ্যে আমাকে ত্রুটি থেকে বাঁচিয়েছে যেখানে আমি ঘটনাক্রমে এক পয়েন্টার টাইপের অন্যটিতে চাপ দেওয়ার চেষ্টা করেছি।
এটি একটি কঠিন প্রশ্ন। এক দিকে, কনরাড জন্য বৈশিষ্ট সংজ্ঞা সম্পর্কে একটি চমৎকার বিন্দু করে তোলে reinterpret_cast যদিও বাস্তবে এটা সম্ভবত একই জিনিস আছে। অন্যদিকে, আপনি যদি পয়েন্টার প্রকারের মধ্যে কাস্টিং করছেন (উদাহরণস্বরূপ কোনও চর * এর মাধ্যমে মেমরিতে সূচি দেওয়ার সময় এটি সাধারণভাবে), স্ট্যাটিক_কাস্ট একটি সংকলক ত্রুটি তৈরি করবে এবং আপনাকে যেভাবেই পুনরায় সংজ্ঞা_কাস্ট ব্যবহার করতে বাধ্য করা হবে ।
অনুশীলনে আমি পুনরায় সংজ্ঞা_কাস্ট ব্যবহার করি কারণ এটি castালাই ক্রিয়াকলাপের উদ্দেশ্য সম্পর্কে আরও বর্ণনামূলক। আপনি অবশ্যই ভিন্ন ভিন্ন অপারেটরের জন্য কেবলমাত্র পয়েন্টার পুনরায় ব্যাখ্যা করতে (যা একই ঠিকানাটি ফেরত দেওয়ার গ্যারান্টিযুক্ত) মনোনীত করার জন্য একটি কেস তৈরি করতে পারেন, তবে স্ট্যান্ডার্ডের মধ্যে একটি নেই।
reinterpret_cast
!
আমি সর্বদা দুর্বলতম সম্ভাব্য castালাই ব্যবহার করার পরামর্শ দিই।
reinterpret_cast
একটিতে পয়েন্টার castালতে ব্যবহৃত হতে পারে float
। Structureালাই যত বেশি কাঠামো ভাঙবে তত বেশি মনোযোগ ব্যবহারের প্রয়োজন।
এর ক্ষেত্রে char*
, আমি সি-স্টাইলের castালাই ব্যবহার করব, যতক্ষণ না আমাদের কিছু থাকে reinterpret_pointer_cast
, কারণ এটি দুর্বল এবং অন্য কিছুই যথেষ্ট নয়।
float f = *reinterpret_cast<const float*>(&p);
float
, যা মিথ্যা। এক্সপ্রেশনটি কাস্ট void **
করে const float *
, এবং তারপরে রূপান্তর const float *
করতে একটি ডেরিফারেন্স অপারেশন (যা কোনও কাস্ট নয়) ব্যবহার করে float
।
আমার ব্যক্তিগত পছন্দটি এইরকম কোড সাক্ষরতার উপর ভিত্তি করে:
void* data = something;
MyClass* foo = reinterpret_cast<MyClass*>(data);
foo->bar();
অথবা
typedef void* hMyClass; //typedef as a handle or reference
hMyClass = something;
const MyClass& foo = static_cast<MyClass&>(*hMyClass);
foo.bar();
তারা উভয়ই শেষ পর্যন্ত একই কাজ করে, তবে স্ট্যাটিক_কাস্টটি মাঝারি ওয়্যারটিতে আরও উপযুক্ত বলে মনে হয়, অ্যাপ্লিকেশনটি পরিবেশিত, আবার পুনরায় ব্যাখ্যা কাস্ট এমন কিছু মনে হয় যা আপনি নিম্ন স্তরের লাইব্রেরি আইএমএইচওতে দেখতে চান।