Utility (C++)
سی + + اسٹینڈرڈ لائبریری میں ہیڈر فائل ہے۔ اس فائل کے دو کلیدی اجزاء ہیں:، ایک نیم اسپیس جس میں ٹیمپلیٹس کا مجموعہ ہوتا ہے جو رشتہ دار آپریٹرز کے لیے ڈیفالٹ رویے کی وضاحت کرتا ہے،،، اور اسی قسم کی اشیاء کے درمیان، صارف کے طے شدہ آپریٹرز پر مبنی اور۔ ایک کنٹینر ٹیمپلیٹ جس میں صوابدیدی قسم کے دو ممبر آبجیکٹ (اور) ہوتے ہیں۔ مزید برآں، ہیڈر ایس کے لیے ڈیفالٹ ریلیشنل آپریٹرز کی وضاحت کرتا ہے جن میں دونوں اقسام مشترک ہیں۔ ریل _ اوپس جی سی سی کا نفاذ نیم اسپیس (نیسٹڈ اندر) کو درج ذیل طریقے سے اعلان کرتا ہے: نیم اسپیس ریل _ اوپس {ٹیمپلیٹ <کلاس _ ٹی پی> ان لائن بول آپریٹر! = (کانسٹ _ ٹی پی اینڈ _ ایکس، کانسٹ _ ٹی پی اینڈ _ وائی) {ریٹرن! (_ _ x = = _ _ y) ؛} ٹیمپلیٹ <کلاس _ ٹی پی> ان لائن بول آپریٹر> (کانسٹ _ ٹی پی اینڈ _ ایکس، کانسٹ _ ٹی پی اینڈ _ وائی) {ریٹرن _ وائی <_ ایکس ؛} ٹیمپلیٹ <کلاس _ ٹی پی> ان لائن بول آپریٹر <= (کانسٹ _ ٹی پی اینڈ _ ایکس، کانسٹ _ ٹی پی اینڈ _ وائی) {ریٹرن! (_ _ y <_ _ x) ؛} ٹیمپلیٹ <کلاس _ ٹی پی> ان لائن بول آپریٹر> = (کانسٹ _ ٹی پی اینڈ _ ایکس، کانسٹ _ ٹی پی اینڈ _ وائی) {واپسی! (_ _ x <_ _ y) ؛} کے درج ذیل اعلامیے پر غور کریں، جو ایک ہی قسم کی دوسری اشیاء کے مقابلے کے لیے مساوات اور آپریٹرز سے کم کی وضاحت کرتا ہے: کلاس A {int بلڈنگ ؛ int روم ؛ عوامی: بول آپریٹر = = (کانسٹ A اور دیگر) کانسٹ {ریٹرن (بلڈنگ = = other.building) & & & (کمرہ = = other.room);} بول آپریٹر <(کانسٹ A اور دیگر) کانسٹ {ریٹرن (بلڈنگ <other.building) | (! (other.building <عمارت) & & & (کمرہ <other.room));} ؛ وایڈ f1 (کانسٹ A & a1, کانسٹ A & a2) {بول برابر = (a1 = = a2) ؛// استعمال = = کلاس A کے اندر بیان کردہ بول ناٹ برابر = (a1! = a2) ؛// غلطی: 'آپریٹر کے لیے کوئی میچ نہیں! =' میں 'a1! = a2' بول کم = (a1 <a2) ؛// استعمال کرتا ہے <کلاس A کے اندر بیان کردہ بول زیادہ سے زیادہ = (a1> a2) ؛// غلطی: 'آپریٹر>' میں 'a1> a2' بول کم برابر = (a1) تاہم، اگر اسی طرح کی مخصوص قسم (یعنی۔ غیر ٹیمپلیٹ) آپریٹر موجودہ دائرہ کار میں موجود ہے، یہاں تک کہ کلاس کی تعریف سے باہر، مرتب کرنے والا اس کے بجائے اسے ترجیح دے گا۔ //(اوپر سے جاری) #include <یوٹیلیٹی> نیم اسپیس کا استعمال کرتے ہوئے اسٹڈی:: ریل _ اوپس ؛// نیچے آپریٹر نے ریل _ اوپس بول آپریٹر کو سپرسیڈس کیا> = (کانسٹ A & a1، کانسٹ A & a2) {ڈو _ سمتھنگ _ ایسل () ؛// کچھ امتیازی ضمنی اثر انجام دیں! (a1 <a2) ؛// لیکن بصورت دیگر اسی طریقہ کار کو استعمال کریں جیسے ریل _ اوپس ؛ وایڈ f2 (کانسٹ A & a1، کانسٹ A & a2) {بول مساوی = (a1 = = a2) ؛// آپریٹر کا استعمال کرتا ہے = = کلاس A کے اندر بیان کردہ بول ناٹ _ مساوی = (a1! = a2) ؛// استعمال کرتا ہے! (a1 = = a2) پر ریل _ اوپس بول لیس = (a1 <a2) ؛// آپریٹر کا استعمال کرتا ہے <کلاس A کے اندر بیان کردہ بول گریٹر = (a1> a2) ؛// استعمال کرتا ہے (a2 <a1) پر ریل _ اوپس بول لیس _ ایکول = (a1 <= a2) ؛// استعمال کرتا ہے! (a2 <a1) پر ریل _ اوپس بول گریٹر _ ایکول = (a1> = a2) ؛// گلوبل آپریٹر کا استعمال کرتا ہے> = اوپر بیان کردہ} کوئی بھی یقینا مندرجہ ذیل کے ساتھ مل کر اعلان کر سکتا ہے، جس سے تمام ریلیشنل آپریٹرز کی مشتق کی اجازت ملتی ہے: ٹیمپلیٹ <کلاس _ ٹی پی> ان لائن بول آپریٹر = = (کانسٹ _ ٹی پی اینڈ _ ایکس، کانسٹ _ ٹی پی اینڈ _ وائی) {ریٹرن! (_ _ x <_ _ y | | _ _ y <_ x) ؛} جوڑی ایک آبجیکٹ کا اعلان، مثال کے طور پر، جیسا کہ دو اراکین پر مشتمل ہوگا، اور، پلس تین کنسٹرکٹر افعال۔ پہلا (ڈیفالٹ) کنسٹرکٹر دونوں اراکین کو ڈیفالٹ ویلیوز اور کے ساتھ شروع کرتا ہے، جبکہ دوسرا ہر قسم کے ایک پیرامیٹر کو قبول کرتا ہے۔ تیسرا ایک ٹیمپلیٹ کاپی کنسٹرکٹر ہے جو کسی بھی قسم کو قبول کرے گا، بشرطیکہ اقسام اور بالترتیب اور اس میں مضمر تبدیلی کے قابل ہوں۔ جی سی سی کا نفاذ طریقہ کار کی وضاحت اس طرح کرتا ہے۔ ٹیمپلیٹ <کلاس _ ٹی 1، کلاس _ ٹی 2> اسٹرک جوڑی {ٹائپڈف _ ٹی 1 فرسٹ ٹائپ ؛ ٹائپڈف _ ٹی 2 سیکنڈ ٹائپ ؛ _ ٹی 1 فرسٹ ؛ _ ٹی 2 سیکنڈ ؛ جوڑی (): فرسٹ ()، سیکنڈ () {} جوڑی (کانسٹ _ ٹی 1 اور _ _ اے، کانسٹ _ ٹی 2 اور _ بی): فرسٹ (_ اے)، سیکنڈ (_ _ بی) {} ٹیمپلیٹ <کلاس _ یو 1، کلاس _ یو 2> جوڑی (کانسٹ جوڑی <_ یو 1، _ یو 2> اور _ پی): فرسٹ (__p.first)، سیکنڈ (__p.second) ؛ اضافی طور پر یہ ہیڈر مثالوں کے لیے تمام چھ ریلیشنل آپریٹرز کی وضاحت کرتا ہے۔ یہ عناصر کی بنیاد پر قسم کی اشیاء کے لیے ایک سخت کمزور ترتیب کی وضاحت کرتے ہیں اور پھر عناصر پر صرف اس صورت میں جب وہ برابر ہوں۔ //مندرجہ بالا ٹیمپلیٹ سے جاری ہے <کلاس _ T1، کلاس _ T2> ان لائن بول آپریٹر = = = (کانسٹ جوڑی <_ T1، _ T2> & _ x، کانسٹ جوڑی <_ T1، _ T2> & _ y) {واپسی __x.first = = __y.first & & __x.second = = __y.second ؛} ٹیمپلیٹ <کلاس _ T1، کلاس _ T2> ان لائن بول آپریٹر <(کانسٹ جوڑی <_ T1، _ T2> & _ x، کانسٹ جوڑی <_ T1، _ T2> & _ y) {واپسی __x.first <__y.first | (! (__y.first <__x.first) & & __x.second <__y.second);} ٹیمپلیٹ <کلاس _ T1, کلاس _ T2> ان لائن بول آپریٹر! = (کانسٹ جوڑی <_ T1, _ T2> & _ _ x, کانسٹ جوڑی <_ T1, _ T2> & _ _ y) {واپسی! (_ _ x = = _ _ y) ؛} ٹیمپلیٹ <کلاس _ T1، کلاس _ T2> ان لائن بول آپریٹر> (کانسٹ جوڑی <_ T1، _ T2> & _ x، کانسٹ جوڑی <_ T1، _ T2> & _ y) {واپسی _ y <_ x ؛} ٹیمپلیٹ <کلاس _ T1، کلاس _ T2> ان لائن بول آپریٹر <= (کانسٹ جوڑی <_ T1، _ T2> & _ x، کانسٹ جوڑی <_ T1، _ T2> & _ y) {واپسی! (_ _ y <_ _ x) ؛} ٹیمپلیٹ <کلاس _ T1، کلاس _ T2> ان لائن بول آپریٹر> = (کانسٹ جوڑی <_ T1، _ T2> & _ _ x، کانسٹ جوڑی <_ T1، _ T2> & _ _ y) {واپسی! (_ _ x <_ _ y) ؛} مزید برآں ہیڈر ایک ٹیمپلیٹ فنکشن پر مشتمل ہوتا ہے جو پیرامیٹرز کی بنیاد پر اس کی واپسی کی قسم کا اندازہ لگاتا ہے:// اوپر کے ٹیمپلیٹ <کلاس _ T1، کلاس _ T2> ان لائن جوڑی <_ T1, _ T2> میک _ پیئر (_ T1 _ x, _ T2 _ y) {ریٹرن جوڑی <_ T1, _ T2> (_ _ x, _ y) ؛} بھی دیکھیں ریلیشنل آپریٹر حوالہ جات بیرونی لنکس C + + حوالہ برائے عام افادیت لائبریری C + + معیاری لائبریری