বলত - অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এবং c++ pdf




কীভাবে স্ট্যান্ড:: অপশনাল কখনই "ব্যতিক্রম দ্বারা মূল্যহীন" হয় না? (2)

std::variant " ব্যতিক্রমহীন মূল্যহীন " নামক একটি রাজ্যে প্রবেশ করতে পারে।

আমি যেমন বুঝতে পেরেছি তবে এর সাধারণ কারণটি যদি কোনও মুভ অ্যাসাইনমেন্ট ব্যতিক্রম ছুঁড়ে দেয়। বৈকল্পিকের পুরাতন মানটি আর উপস্থিত থাকার গ্যারান্টিযুক্ত নয় এবং উদ্দেশ্যযুক্ত নতুন মানও নয়।

std::optional যদিও এর মতো অবস্থা নেই। cppreferences সাহসী দাবি করে:

যদি কোনও ব্যতিক্রম নিক্ষেপ করা হয়, * এটির ... আরম্ভের অবস্থাটি অপরিবর্তিত, অর্থাৎ যদি বস্তুটির কোনও মান থাকে তবে এটিতে এখনও একটি মান থাকে এবং অন্যভাবে রাউন্ড থাকে।

std::optional কীভাবে "ব্যতিক্রম দ্বারা মূল্যহীন" হওয়া এড়াতে সক্ষম?


"ব্যতিক্রম দ্বারা মূল্যহীন" একটি নির্দিষ্ট দৃশ্যের বোঝায় যেখানে আপনাকে বৈকল্পিকের মধ্যে সঞ্চিত ধরণটি পরিবর্তন করতে হবে। এর জন্য অগত্যা প্রয়োজন 1) পুরানো মানটি ধ্বংস করে এবং 2) তার জায়গায় নতুনটি তৈরি করা। যদি 2) ব্যর্থ হয়, আপনার কাছে ফিরে যাওয়ার কোনও উপায় নেই (কমিটির কাছে অযথা ওভারহেড গ্রহণযোগ্য নয়)।

optional চ্ছিক এই সমস্যা নেই। যদি অবজেক্টটিতে কিছু অপারেশন থাকে তবে এটি ব্যতিক্রম ছুঁড়ে ফেলেছে, তাই হোক। বস্তু এখনও আছে। এর অর্থ এই নয় যে অবজেক্টের অবস্থা এখনও অর্থবহ - এটি নিক্ষেপকারী অপারেশনটি যা কিছু ছেড়ে দেয়। আশা করি সেই অপারেশনটির কমপক্ষে প্রাথমিক গ্যারান্টি রয়েছে।


optional<T> এর একটিতে দুটি রাষ্ট্র রয়েছে:

  • একটি T
  • খালি

এক variant থেকে অন্য রাজ্যে স্থানান্তরিত হলে রূপান্তরটি কেবল মূল্যহীন অবস্থায় প্রবেশ করতে পারে - কারণ আপনাকে কোনওভাবেই মূল বস্তুটি পুনরুদ্ধার করতে হবে এবং এটির জন্য বিভিন্ন কৌশলগুলি অতিরিক্ত স্টোরেজ 1 , গাদা বরাদ্দ 2 , বা একটি খালি রাষ্ট্র প্রয়োজন recover

তবে optional চ্ছিকর জন্য, T থেকে খালি স্থানান্তরিত করা কেবল একটি ধ্বংস is যাতে কেবলমাত্র T এর ডেস্ট্রাক্টর নিক্ষেপ করে এবং সত্যই সেই পয়েন্টে কে যত্নশীল। এবং খালি থেকে T তে স্থানান্তরিত করা কোনও সমস্যা নয় - যদি এটি ছুড়ে যায় তবে মূল বিষয়টিকে পুনরুদ্ধার করা সহজ: শূন্যস্থান খালি is

চ্যালেঞ্জিং emplace() হ'ল: emplace() যখন আমাদের ইতিমধ্যে একটি T ছিল। আমাদের অগত্যা আসল অবজেক্টটি ধ্বংস করা দরকার, তাই যদি এম্প্লেস নির্মাণ নিক্ষেপ করা হয় তবে আমরা কী করব? With optional , আমাদের ফ্যালব্যাকের জন্য একটি জ্ঞাত, সুবিধামত খালি অবস্থা রয়েছে - সুতরাং নকশাটি এটি করা মাত্র।

পুনরুদ্ধার করা সহজ রাষ্ট্রটি না হওয়া থেকে variant সমস্যা।

1 boost::variant2 হিসাবে boost::variant2 করে।
2 যেমন boost::variant করে।
3 আমি এটির বৈকল্পিক বাস্তবায়নের বিষয়ে নিশ্চিত নই, তবে একটি নকশার পরামর্শ ছিল যে variant<monostate, A, B> monostate রাজ্যে রূপান্তর করতে পারে যদি এটি A এবং B রূপান্তর ছুঁড়ে যায়।





std-variant