সি ++ ২০ তম :: কমন_রিফারেন্সের উদ্দেশ্য কী?


উত্তর:


46

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প্রক্সি পুনরুক্তি থাকে।


2
সম্ভবত আমি ঘন, তবে আপনি কি জিপ-জুটির উদাহরণে সাধারণ রেফারেন্সটি স্পষ্ট করে বলতে পারেন?
হ্যাপিডেভ

4
আদর্শভাবে, pair<T&,U&>এবং pair<T,U>&একটি সাধারণ রেফারেন্স থাকবে, এবং এটি সহজভাবে হবে pair<T&,U&>। যাইহোক, জন্য std::pairসেখান থেকে কোন রূপান্তর হয় pair<T,U>&করতে pair<T&,U&>যদিও এই ধরনের একটি রূপান্তর নীতিগতভাবে শব্দ। (এটি, ঘটনাচক্রে, কেন আমাদের zipC ++ 20 এ কোনও দৃষ্টিভঙ্গি নেই))
এরিক নিবলার

4
@ এরিকনিবলার: " এটি, ঘটনাক্রমে, কেন আমাদের সি ++ ২০-এ জিপ ভিউ নেই " "একটি জিপ পুনরায় ব্যবহারকারীর ব্যবহার করার দরকারের কোনও কারণ নেই pair, বিশেষত তার উদ্দেশ্যটির জন্য ডিজাইন করা যেতে পারে এমন একটি প্রকারের পরিবর্তে Is , যথাযথ অন্তর্নিহিত রূপান্তর প্রয়োজন হিসাবে?
নিকল বোলাস

5
@ নিকোল বোলাস ব্যবহার করার দরকার নেই std::pair; উপযুক্ত রূপান্তরগুলির সাথে উপযুক্ত কোনও জুড়ি-জাতীয় টাইপটি করবে এবং পরিসর-ভি 3 এই জাতীয় জুটির মতো ধরণের সংজ্ঞা দেয়। কমিটিতে, এলইউডাব্লু স্ট্যান্ডার্ড লাইব্রেরিতে এমন একটি ধরণের সংযোজন করার ধারণা পছন্দ করে নি যা প্রায় ছিল তবে বেশ std::pairনয়, তা আদর্শিক হোক বা না হোক, প্রথমে কেবল std::pairকাজ করার পক্ষে এবং কৌশল সম্পর্কে যথাসাধ্য চেষ্টা না করেই করুন ।
এরিক নিবলার

3
tuple, pair, tomato, to- MAH- topairএই দুর্দান্ত বৈশিষ্ট্যটি রয়েছে যা আপনি .firstএবং সহ উপাদানগুলিতে অ্যাক্সেস করতে পারেন .second। স্ট্রাকচার্ড বাইন্ডিংগুলি tupleএস এর সাথে কাজ করার কিছু বিশ্রীতার সাথে সহায়তা করে তবে সমস্ত কিছু নয়।
এরিক নাইবার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.