উপর 2017-11-11 , আইএসও সি ++ কমিটির গৃহীত ঔষধি Sutter 's প্রস্তাব <=> "মহাকাশযান" তিনপথ তুলনা অপারেটর যে যোগ করা হয় নি নতুন বৈশিষ্ট্য এক হিসাবে সি ++ 20 । ধারাবাহিক তুলনা সুটার শিরোনামের কাগজে , মোরার এবং ব্রাউন নতুন ডিজাইনের ধারণাগুলি প্রদর্শন করে। প্রস্তাবনাটির ওভারভিউয়ের জন্য নিবন্ধের একটি অংশ এখানে দেওয়া হয়েছে:
অভিব্যক্তি একটি <=> খ আয় একটি বস্তু যে তুলনা <0 যদি একটি <b , তুলনা > 0 যদি একটি> খ , এবং তুলনা == 0 যদি a ও b সমান / সমতুল্য।
সাধারণ ক্ষেত্রে: আপনার টাইপ এক্স এর জন্য সমস্ত ধরণের ওয়াইয়ের সাথে সদস্যতার সাথে শব্দার্থক শব্দগুলির সাথে সমস্ত তুলনা লিখতে কেবল লিখুন:
auto X::operator<=>(const Y&) =default;
উন্নত ক্ষেত্রে: আপনার টাইপ এক্স এর জন্য সমস্ত ধরণের ওয়াইয়ের সাথে সমস্ত তুলনা লিখতে , কেবল অপারেটর লিখুন <=> যা একটি ওয়াই লাগে , পছন্দসই হলে সদস্যপদার্থ শব্দার্থার্থ পেতে = ডিফল্ট ব্যবহার করতে পারেন
এবং উপযুক্ত বিভাগের প্রকারটি ফেরত পাবেন:
- যদি আপনার ধরণটি প্রাকৃতিকভাবে <টি সমর্থন করে তবে একটি _র্ডারিং ফিরিয়ে দিন , এবং আমরা দক্ষতার সাথে প্রতিসাম্য তৈরি করব < , > , <= , > = , == , এবং
! = ; অন্যথায় একটি আসতে _equality , এবং আমরা দক্ষতার সঙ্গে প্রতিসম তৈরি করে দেব == এবং ! = ।
- রিটার্ন strong_ যদি আপনার টাইপ জন্য একটি == খ বোঝা চ (ক) == চ (খ) (substitutability, যেখানে চ শুধুমাত্র তুলনা-লক্ষণীয় রাষ্ট্র পাবলিক ব্যবহার প্রবেশযোগ্য সার্চ const সদস্য), অন্যথায় আসতে
weak_ ।
তুলনা বিভাগ
পাঁচটি তুলনামূলক বিভাগগুলি std::প্রকার হিসাবে সংজ্ঞায়িত করা হয় , যার প্রত্যেকটিতে নিম্নলিখিত বর্ণিত মান থাকে:
+--------------------------------------------------------------------+
| | Numeric values | Non-numeric |
| Category +-----------------------------------+ |
| | -1 | 0 | +1 | values |
+------------------+------+------------+---------------+-------------+
| strong_ordering | less | equal | greater | |
| weak_ordering | less | equivalent | greater | |
| partial_ordering | less | equivalent | greater | unordered |
| strong_equality | | equal | nonequal | |
| weak_equality | | equivalent | nonequivalent | |
+------------------+------+------------+---------------+-------------+
এই ধরণের মধ্যে অন্তর্ভুক্ত রূপান্তরগুলি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়েছে:
strong_orderingমান { less, equal, greater} পরোক্ষভাবে ধর্মান্তরিত:
weak_orderingমান { less, equivalent, greater}
partial_orderingমান { less, equivalent, greater}
strong_equalityমান { unequal, equal, unequal}
weak_equalityমান { nonequivalent, equivalent, nonequivalent}
weak_orderingমান { less, equivalent, greater} পরোক্ষভাবে ধর্মান্তরিত:
partial_orderingমান { less, equivalent, greater}
weak_equalityমান { nonequivalent, equivalent, nonequivalent}
partial_orderingমান { less, equivalent, greater, unordered} পরোক্ষভাবে ধর্মান্তরিত:
weak_equalityমান { nonequivalent, equivalent, nonequivalent, nonequivalent}
strong_equalityমানগুলির সাথে { equal, unequal} সুস্পষ্টভাবে রূপান্তরিত করে:
weak_equalityমান সহ equivalent, nonequivalent}
ত্রি-উপায়ে তুলনা
<=>টোকেন আবির্ভাব ঘটে। পুরানো উত্স কোডে অক্ষরের ক্রমটি <=>টোকেনাইজ করে <= >। উদাহরণস্বরূপ, X<&Y::operator<=>এর অর্থ ধরে রাখতে একটি স্থান যুক্ত করা দরকার।
ওভারলোডযোগ্য অপারেটর <=>একটি ত্রি-উপায়ে তুলনা ফাংশন এবং এর চেয়ে বেশি <এবং কমের প্রাধান্য রয়েছে <<। এটি এমন প্রকারের প্রত্যাবর্তন করে যা আক্ষরিকের সাথে তুলনা করা যেতে পারে 0তবে অন্যান্য রিটার্নের ধরণগুলি যেমন এক্সপ্রেশন টেম্পলেটগুলিকে সমর্থন করার জন্য অনুমোদিত। সমস্ত <=>অপারেটর ভাষা এবং স্ট্যান্ডার্ড লাইব্রেরিতে সংজ্ঞায়িত 5 বর্ণিত std::তুলনা বিভাগের ধরণের মধ্যে একটি ফেরত দেয় ।
ভাষার ধরণের জন্য, নিম্নলিখিত অন্তর্নির্মিত <=>একই ধরণের তুলনা সরবরাহ করা হয়। অন্যথায় উল্লিখিত ব্যতীত সমস্ত কনসটেক্সপ্রস । এই তুলনাগুলি স্কেলার প্রচার / রূপান্তরগুলি ব্যবহার করে ভিন্নজাতীয়ভাবে আহ্বান করা যায় না।
- জন্য
bool, অবিচ্ছেদ্য এবং পয়েন্টার ধরণের, <=>প্রত্যাবর্তন strong_ordering।
- পয়েন্টার ধরণের জন্য, বিভিন্ন সিভি-যোগ্যতা এবং উত্স-থেকে-বেস রূপান্তরগুলিকে একটি সজ্জা অন্তর্নির্মিত প্রার্থনা করার অনুমতি দেওয়া হয়
<=>, এবং সেখানে অন্তর্নির্মিত ভিন্ন ভিন্ন হয় operator<=>(T*, nullptr_t)। একই বস্তু / বরাদ্দের সাথে পয়েন্টারের তুলনা কেবল ধ্রুবক প্রকাশ।
- মৌলিক ভাসমান পয়েন্টের ধরণের জন্য,
<=>রিটার্ন পেতে partial_orderingএবং বৃহত্তর ভাসমান পয়েন্টের ধরণের যুক্তিগুলি প্রশস্ত করে বিজাতীয়ভাবে আহ্বান করা যেতে পারে।
- গণনার জন্য,
<=>গণনার অন্তর্নিহিত প্রকারের মতোই ফেরত দেয় <=>।
- জন্য
nullptr_t, <=>রিটার্ন strong_orderingএবং সর্বদা ফলন equal।
- অনুলিপিযোগ্য অ্যারেগুলির জন্য,
T[N] <=> T[N]একই ধরণের T'গুলি হিসাবে ফেরত দেয় <=>এবং লিক্সোগ্রাফিকাল এলিমেন্টের তুলনা করে। <=>অন্যান্য অ্যারে জন্য নেই ।
- কারণ
voidনেই <=>।
এই অপারেটরের অভ্যন্তরীণ কাজগুলি আরও ভালভাবে বুঝতে, দয়া করে মূল কাগজটি পড়ুন । অনুসন্ধান ইঞ্জিনগুলি ব্যবহার করে আমি এটি সন্ধান করেছি।