সি ++ 20 পরিচয় করিয়ে দেয় std::common_reference
। এর উদ্দেশ্য কী? কেউ এটি ব্যবহারের উদাহরণ দিতে পারে?
সি ++ 20 পরিচয় করিয়ে দেয় std::common_reference
। এর উদ্দেশ্য কী? কেউ এটি ব্যবহারের উদাহরণ দিতে পারে?
উত্তর:
common_reference
আমার প্রয়াস থেকে বেরিয়ে এসেছেন এসটিএল এর পুনরাবৃত্তির একটি ধারণাগতকরণ যা প্রক্সি পুনরাবৃত্তির সমন্বয় করে।
এসটিএলে, পুনরাবৃত্তকারীগুলির সাথে দুটি বিশেষ প্রকারের আগ্রহ রয়েছে: reference
এবং value_type
। পূর্ববর্তীটি পুনরাবৃত্তকারীগুলির রিটার্ন টাইপ operator*
এবং value_type
অনুক্রমের উপাদানগুলির (নন-কনস্ট্যান্ট, অ-রেফারেন্স) প্রকার।
জেনেরিক অ্যালগরিদমগুলির প্রায়শই এই জাতীয় জিনিসগুলি করা দরকার:
value_type tmp = *it;
... সুতরাং আমরা জানি যে এই দুটি ধরণের মধ্যে কিছুটা অবশ্যই সম্পর্ক রয়েছে। অ-প্রক্সি পুনরাবৃত্তকারীদের জন্য সম্পর্কটি সহজ: reference
সর্বদা value_type
, optionচ্ছিকভাবে কনস্ট এবং রেফারেন্স যোগ্য। ধারণাটি সংজ্ঞায়নের প্রথম InputIterator
প্রয়াসের প্রয়োজন ছিল যে অভিব্যক্তিটি *it
রূপান্তরিত হয়েছিল const value_type &
এবং সবচেয়ে আকর্ষণীয় পুনরাবৃত্তিকারীদের পক্ষে এটি যথেষ্ট।
আমি চেয়েছিলাম সি ++ ২০ এর পুনরুক্তিকারীরা এর চেয়ে আরও শক্তিশালী হোক। উদাহরণস্বরূপ, zip_iterator
লক-স্টেপে দুটি ক্রমকে পুনরাবৃত্তি করা এমন একটির প্রয়োজনীয়তাগুলি বিবেচনা করুন । আপনি যখন a কে অবজ্ঞাপন করেন zip_iterator
, আপনি pair
দুটি পুনরাবৃত্তির reference
প্রকারের একটি অস্থায়ী পাবেন । সুতরাং, zip
'এং vector<int>
এবং এ'র সাথে vector<double>
এই সম্পর্কিত প্রকারগুলি থাকবে:
zip
পুনরুক্তি reference
: pair<int &, double &>
zip
পুনরুক্তি value_type
:pair<int, double>
আপনি দেখতে পাচ্ছেন, কেবলমাত্র শীর্ষ-স্তরের সিভি- এবং রেফের যোগ্যতা যুক্ত করে এই দুটি ধরণের একে অপরের সাথে সম্পর্কিত নয়। এবং তবুও দুটি ধরণের যথেচ্ছভাবে পৃথক হতে দেওয়া ভুল অনুভব করে। স্পষ্টতই এখানে কিছু সম্পর্ক আছে। তবে সম্পর্ক কী, এবং জেনেরিক অ্যালগরিদমগুলি যা পুনরাবৃত্তকারীদের উপর পরিচালিত হয় সেগুলি দুটি ধরণের সম্পর্কে নিরাপদে ধরে নিতে পারে?
সি ++ 20 এর উত্তরটি হ'ল কোনও বৈধ পুনরাবৃত্তকারী প্রকারের জন্য, প্রক্সি বা না, ধরণের reference &&
এবং value_type &
একটি সাধারণ রেফারেন্স ভাগ করে নিন । অন্য কথায়, কিছু পুনরাবৃত্তাকারীর it
জন্য কিছু প্রকার থাকে CR
যা নিম্নলিখিতগুলি সু-গঠিত করে তোলে:
void foo(CR) // CR is the common reference for iterator I
{}
void algo( I it, iter_value_t<I> val )
{
foo(val); // OK, lvalue to value_type convertible to CR
foo(*it); // OK, reference convertible to CR
}
CR
সাধারণ রেফারেন্স হয়। সমস্ত অ্যালগরিদম এই ধরণের উপস্থিতিটির উপর নির্ভর করতে পারে std::common_reference
এবং এটি গণনা করতে ব্যবহার করতে পারে।
সুতরাং, এটিই common_reference
সি ++ 20 তে এসটিএলে যে ভূমিকা পালন করে । সাধারণত, আপনি জেনেরিক অ্যালগরিদম বা প্রক্সি পুনরাবৃত্তি না লিখলে আপনি নিরাপদে এটিকে উপেক্ষা করতে পারবেন। আপনার পুনরাবৃত্তিকারীরা তাদের চুক্তিবদ্ধ বাধ্যবাধকতাগুলি পূরণ করছে তা নিশ্চিত করে সেখানে এটি রয়েছে under
সম্পাদনা: ওপিও উদাহরণ চেয়েছিল। এটি একটি সামান্য কল্পিত, কিন্তু এটা এর সি ++ 20 কল্পনা এবং আপনি একটি র্যান্ডম অ্যাক্সেস পরিসর দেওয়া হয় r
ধরনের R
যা সম্পর্কে আপনি কিছুই জানেন, এবং আপনি করতে চান sort
পরিসীমা।
আরও কল্পনা করুন যে কোনও কারণে আপনি একটি মনোমরফিক তুলনা ফাংশনটি ব্যবহার করতে চান, যেমন std::less<T>
। (হতে পারে আপনি করেছি পরিসীমা টাইপ-মুছে, এবং আপনি তুলনা ফাংশন টাইপ-মুছতে এবং একটি মাধ্যমে এটি পাস করতে হবে virtual
? আবার, একটি প্রসারিত।) কি করা উচিত T
হতে std::less<T>
? তার জন্য আপনি ব্যবহার করতে পারেন common_reference
, বা সহায়ক iter_common_reference_t
হিসাবে এটি কার্যকর হয়।
using CR = std::iter_common_reference_t<std::ranges::iterator_t<R>>;
std::ranges::sort(r, std::less<CR>{});
এটি কাজের গ্যারান্টিযুক্ত, এমনকি যদি পরিসরের r
প্রক্সি পুনরুক্তি থাকে।
pair<T&,U&>
এবং pair<T,U>&
একটি সাধারণ রেফারেন্স থাকবে, এবং এটি সহজভাবে হবে pair<T&,U&>
। যাইহোক, জন্য std::pair
সেখান থেকে কোন রূপান্তর হয় pair<T,U>&
করতে pair<T&,U&>
যদিও এই ধরনের একটি রূপান্তর নীতিগতভাবে শব্দ। (এটি, ঘটনাচক্রে, কেন আমাদের zip
C ++ 20 এ কোনও দৃষ্টিভঙ্গি নেই))
pair
, বিশেষত তার উদ্দেশ্যটির জন্য ডিজাইন করা যেতে পারে এমন একটি প্রকারের পরিবর্তে Is , যথাযথ অন্তর্নিহিত রূপান্তর প্রয়োজন হিসাবে?
std::pair
; উপযুক্ত রূপান্তরগুলির সাথে উপযুক্ত কোনও জুড়ি-জাতীয় টাইপটি করবে এবং পরিসর-ভি 3 এই জাতীয় জুটির মতো ধরণের সংজ্ঞা দেয়। কমিটিতে, এলইউডাব্লু স্ট্যান্ডার্ড লাইব্রেরিতে এমন একটি ধরণের সংযোজন করার ধারণা পছন্দ করে নি যা প্রায় ছিল তবে বেশ std::pair
নয়, তা আদর্শিক হোক বা না হোক, প্রথমে কেবল std::pair
কাজ করার পক্ষে এবং কৌশল সম্পর্কে যথাসাধ্য চেষ্টা না করেই করুন ।
tuple
, pair
, tomato
, to
- MAH
- to
। pair
এই দুর্দান্ত বৈশিষ্ট্যটি রয়েছে যা আপনি .first
এবং সহ উপাদানগুলিতে অ্যাক্সেস করতে পারেন .second
। স্ট্রাকচার্ড বাইন্ডিংগুলি tuple
এস এর সাথে কাজ করার কিছু বিশ্রীতার সাথে সহায়তা করে তবে সমস্ত কিছু নয়।