 اسلام علیکم Today's lecture number 41 of CS201 Introduction to Programming پیچھلی دفعہ ہم نے کچھ بات کی تھی about objects being used as data members within classes A very common use as you will find that it has a lot of use and code reused اس کا ایک اچھا طریقہ ہے یعنی کمپیٹلی دیبگڈ کوڑ تیار کر کے رکھلیا اور پھر اس کو استعمال کیا as building blocks for developing new and more complex classes آج ہم جس چیز کی بات کرنے جا رہے ہیں وہ بھی ایک code reuse کا ہی طریقہ ہے but it has to do with a different style of reuse it is called templates templates جو ہیں وہ c++ میں دو different varieties میں آتی ہیں ایک variety جو ہے وہ ہے function templates اور دوسرہ جو ہے وہ ہے class templates آج کے لیکچر میں ہم function templates کے بارے میں بات کریں گے now what is a template we have to think about it کو پتا ہے template کیا ہوتی؟ i am sure آپ نے بچپن میں بہت ساری templates استعمال کی ہیں کچھ بنائی بھی ہوں گی کچھ خریدی بھی ہوں گی لیکن ہمار پر چھوٹے چھوٹے فٹے ملتے ہیں بچوں کے لیے جس کے اندر various shapes کٹی ہوتی ہیں کو ٹرائنگل کٹا ہے کو سکویر کٹا ہے کو سرکل کٹا ہے اور اس کو ہم استعمال کیسلیہ کرتے ہیں کہ یہ شیپs بنانی ہوگر کاغز بے تو ہم رکھ کے بیچ میں پینسل پھیری اور وہ شیپ بن گئی ان کو نواملی ہم stencils کہتے ہیں but in a way it is also a template دوسرہ طریقہ یہ ہے سوچنے کا کہ یہ template جو ہے ایک خاکہ ہے کوئی چیز دیار کرنے کا میں نے اگر ایک special design بنانا ہے کسی چیز کا let's say میں نے ایک furniture کا design بنانا ہے تو اس کے لیے پہلے میں ایک template تیار کرتا ہوں جو کہ actual piece of furniture نہیں ہوتا اس کے لیے دیکھاتا ہوں کہ جی اس کی یہ شکل بنیں گی اس کی پوری outline وگرہ تیار کر کے پھر اس کو رکھ کے میں چیزیں کارت لیتا ہوں that itself is again a template nice thing if you think about this کہ جی اگر میں نے ایک shape let's say a triangle اس کے لیے ایک template بنالی ہے تو اب میں کیا چیز اس سے کارتا ہوں has nothing to do with کہ جی میں نے template کیا وہ کس چیز کی بنی ہوئی ہے I can think of making a triangular template and then drawing it on a piece of wood and cutting wood into a triangle I can also draw use the same template put it on a piece of metal ایک sheet کے اوپر رکھ کے metal کا ایک triangle کرتا ہوں and so on so forth so in a way that template is allowing me reuse of a certain shape that is the concept that we are going to try and develop over here when we talk about template functions پہلے تھوڑا سا ہم اس کو justify کرنی کی طرف چلتے ہیں کہ جس کا فائدہ کیا ہو سکتا ہے دیکھیں ایک function for example ہم استعمال کرتے ہیں بار بار وہ ہے swap کا function جی دو چیزیں ہیں ان کو آپس میں ہم نے inter change کرنا ہے اور آپ کو technique تو اب تک یاد ہوگی کہ ہم usually a 3rd place holder استعمال کرتے ہیں جیسے int, i اور j کو ہم swap کرنا چاہتے ہیں تو ہم کوئی int, temp ڈیکلیر کر لیتے ہیں پھر ہم کہتے ہیں temp is equal to i i is equal to j j is equal to temp a very generic way of inter changing two values the problem is کہ جی میں نے integers کو اگر swap کرنا ہے تو میں نے integers swap function لکتی ہے پھر اگر میں نے doubles کو swap کرنا ہے تو میں نے doubles کے لیے ایک function لکتی ہے and so on so forth every time I need to use a swapping technique اس کے لیے مجھے علیادہ سے function لکھنا پڑتا ہے کیا ہم لکھ سکتے ہیں ایسے functions the answer is yes اس کے لیے جو rule اپلائے کرتا تھا وہ تھا function overloading overloading آپ کو یاد ہوگا you can have a function with the same name as long as the types or the number of the arguments are different اگر وہ different ہے تو compiler can detect کہ کون سا والا function استعمال کرنا ہے اور اس کو appropriately call کر لے گا so you could define swap for integers you could define swap for floats you could define swap for doubles or charts even اور اس کے آپ ملٹپل copies بنا لیتے ہیں copies نہیں multiple versions بنا لیتے ہیں which are using different data types and then depending on what is required the compiler will automatically make a call to the correct function یہ تھا overloading but if you think about it یہاں پہ ہم نے کوڑ تو بار بار لکھا ہی ہے swap integer کیلئے علیادہ لکھا ہے swap doubles کیلئے علیادہ لکھا ہے چار کیلئے علیادہ لکھا ہے but the code itself was very very similar یعنی there was something temp temp is equal to I yes temp is equal to the first thing I'll call it a thing for the moment first thing is equal to the second thing and the second thing is equal to temp یہ ایک جنرک کیسم کا quote ہے وہ جو ہم بار بار لکھ رہے ہیں تو کیا ہی اچھا ہو کہ code ہی ہم ایک دفعہ لکھیں and then let the language of the compiler handle everything else یہ جو لکھنے کا طریقہ ہے اس کو ہم کہتے ہیں templates یا function templates اب ہم وہ جو میں نے example دیا تھا کوئے لکڑی کے triangle کا یہ گھتے کا ہم نے triangle کاٹ لیا اب ہم ایک جنرک function نہیں کریں گے کونسی والی ڈیٹا تیپ کے اوپر اس نے act کرنا ہے وہ جب ڈیفائن ہو جائے گا تو پھر جہاں پہ وہ استعمال ہوگا وہ automatically اس طرح کا function call کر لے گا now the issue is کہ جی ایک جو میں نے function overloading کا example دیا ہے اس کے اندر the automatic part is there but we wrote all of those functions separately here the automatic part is even more in other words we write one template function without specifying a data type پھر وہ اگر int کے لئے call ہونا ہے تو compiler خود اس function کا int version لکھ دے گا آپ کے لئے اگر وہ double کے لئے call ہونا ہے تو compiler خود double کا ایک version لکھ دے گا this does not happen at run time this happens at compile time your program compiler response ڈیٹا MATT Puis workflow again come out 파ک out anditt out out out out out out out out اللغاق بہت ہے. کمپیلرز سارے بہت محلی نہیں کرتے ہیں بہت آپ اس کے ساتھ لا تاکہ محلی نہیں کرتے ہیں۔ کامپیلرز کے ساتھ محلی کے ساتھ محلی نہیں کرتے ہیں۔ کیورڈ ایک ہمار پر تیمپلٹ استعمال ہوگا۔ اس کے بعد اینگل بیکٹ سستعمال ہوگے۔ اب اینگل بیکٹس اس کو نام دی رہا ہوں میں، جو آپ کے ایک گریٹر دن اور لیس than سائن ہے۔ اور پھر ایک کیورڈ ہے، کلاس وہ ہم استعمال کریں گے، لیکن یہ وہوالی کل preserved نیا جو حاجتا کھ greedfain کر دیاwing it's a different you show of the equationitting when you want to define لکھتے ہیں ٹیمپلٹ اور پھر انگل برکٹس کے اندر ہم کہتے ہیں کوئی لسٹ آجاتی ہے of جنریک ڈیٹا ٹائپس جب ہم ڈیٹا ٹائپ کی بات کرتے ہیں جنرک کی تو اس کو لکھا جاتا ہے کلاس اور پھر کوئی نام ویریبل کا نام so we write ڈیٹا ٹیمپلٹ and within انگل برکٹس we write کلاس let's ڈی now I'm saying ڈی because یہ آپ کو کتابوں میں بار بار جگہ پر ڈی ہی نظر آئے گا it's a usual usage but اس پر لیمٹ نہیں ہے آپ کا جو دل کرے آپ استعمال کر سکتے ہیں normally ڈی stands for ڈیمپلٹ so that is what how it has evolved کے ہر جگہ پہ آپ کو ڈیمپلٹ ڈی نظر آ رہا ہوگا یہ تو پہلی لائن ہے اس کے بعد جو فنکشن کی ڈیکلریشن ہے which is normally the prototype line but in this ڈیس کس is the first line of the function اس کے اندر کم از کم ایک جنریک پرامیٹر ہونا چاہیے یعنی اس کی argument list میں normal function کی ڈیکلریشن اگر آپ دیکھیں وہ ہے return ڈیپ پھر function کا نام پھر اس کی argument list ڈیپ بزاتے خود جو ہے وہ بھی یہ generic ڈیپ ہو سکتی ہے اس کے بعد اس کی argument list کے اندر کم از کام ایک چیز جو ہے وہ generic ہونی چاہیے let us take a very simple example جو میں آپ کو swap کیا دیا تھا اس سے ذراہ سے آسان سے شروع کرتے ہیں ہم بات کرتے ہیں ایک function called reverse reverse کیا کرے گا کہ جو بھی ہم نے اس کو pass کیا چیز let's say int کیا یا ڈبل کیا ہے اس کو وہ minus version اس کا واپس کر دے گا so normally ہم لکھیں گے اس کو int reverse x یا int reverse int x xb جو ہے وہ integer pass ہو رہا ہے or within the body of the reverse function we say return minus x simple اسی طریقے سے ہم نے ایک ڈبل استمال کر لیا so we say double reverse double x return minus x and so on so forth you can define it for a float اس چیز کو جب ہم template میں لے کے جاتے ہیں اس کو ہم لکھیں گے template class t capital t normally استمال ہو رہا ہوتا ہے you can use a b c whatever you want اور پھر function جو define ہوگا اس میں return ڈبل کی جگہ پہ ڈبل یا ڈبل یا float لکھنے کی بجائے ہم ڈی لکھیں گے اوپر ہماری جناریک ڈیٹر طاپ آگئے اب لکھیں ڈی پھر reverse اور پھر اس کے جو آگومنٹ لیسٹ ہے اس میں ڈیٹر طاپ is now t t اور آگے x اور اس کے اندر ہم لکھتے ہیں return minus x for the moment ہم اسی سے کام کرتے ہیں کہ یہ ڈبل اور float کے ساتھ ہم کام کر رہے ہوں گے اتنا سا ہم نے function لکھا جس میں ہم نے ڈبل float کا کیورد استمال نہیں کیا اوپر ہم نے کہاہ ڈیٹر بیٹر ایک مطابق جو پہلے ہم نے function آپ کو دکھائے آپ کیا ڈیٹر ڈیٹر پر خلی رہے گا یہ ایک کوپی بنا جاتی ہے ات کامپائل ڈائنگ اور پھر کامپائل ہوگے اس کا سارا کورد جو ہے آپ کے program کے اندر شامل ہو جاتا ہے اور امرٹ کال will happen ڈیٹر ڈیٹر ڈیٹر ڈیٹر ڈیٹر سکنے کیا جب ہم نے ایک کسی فنچن کے اندر ریورس آئی لکھا وہاں ہمیں بتانے کی ضرورت نہیں ہے کہ جی یہ انٹ کا ورجن ہمیں کال کرنا ہے The compiler will automatically detect the data type and create a copy of the function of the appropriate data type This is important to understand کیونکہ ابھی چاہ کے آگے ہم دیکھیں گے یہاں پہاں اس کو ہم تھوڑا سا force بھی کر سکتے ہیں اسی طریقے سے بیشاک اسی پروگرم کے اندر آپ کہ دیتے ہیں اور اگر آپ لکھیں گے ریورس آئی The compiler will again detect یہی پروگرم ریورس آئی بھی کر رہا ہے اور ریورس آئی بھی کر رہا ہے اور آئی جو ہے وہ انٹ ہے اور آئی جو ہے وہ دبل ہے وہ ایک ورزن of the template function انٹ کے لیے جنریٹ کرے گا اور ایک ورزن of the template function دبل کے لیے جنریٹ کرے گا تو کوڑ ہی دبل ہو گیا پھر اس کو کمپائل کر دیا جائے گا اور آپ کا پروگرم ٹیکسا چلے گا تو آپ کو آپ کو میجک ہے جب آپ کو حالت کرتا ہے اور آپ کو سکتے ہیں اور اسی آئی ایک ورزن of the code reuse کیوں؟ کیوں؟ جو template function ہے اس کے لکھنے پھر آپ نے زور لگانا ہے کہ جی وہ تھیک ترہ لکھا جائے وہ جنریک ہو in nature اور آپ کو سکتے ہیں یہ سبہ یہ آئی ہوئے but I've already given you an example of Swap Swap بار بار ہمیں کرنا پڑتا ہے اور ریورس کو لکھیں ابھی ابھی آگے چلیں گے اس کا دیکھیں گے کہ کہاں کہاں use ہو سکتا ہے جب بھی آپ کے پاس swap یا reverse یا اس کسم کا کام آئے جہاں پہ بھی آپ کو لگے یہ جو کوڈ میں لکھ رہا ہوں یا لکھ رہی ہوں اس کوڈ کے لئے ایک ساملیہ سیملر than ایک کوڈ کے لئے ہی رٹنے کے لئے آپ کو دیکھنے کے لئے آپ کو دیکھنے کے لئے آپ کو دیکھنے کے لئے یہ ساری چیز تو میں نے انٹز کے لئے لکھی ہوئی ہے اب مجھے دبل کے لئے لکھنی پڑھ رہی ہے اور دیکھنے کے لئے مجھے ب gern اسی مجھے سیملات کے لئے مجھے مجھے سیملٹ کے لئے یہ آپ کو مجھے دیکھنے معلوم ہنا ہے اب نواری تھی اختسمی تھی کیا کہ جاننا مجھے اٹس مثل کے لئے ہمیں ایک ٹیمپلٹت ایک روچی انٹمپلٹ ایک روچی اور اس آندر کود ریوز ہے کلی آپ کے لئے خود ہی جنریٹ کر دیکھنے دیکھیں ہمارے پاس میکسور어요 تھی مجود تھی شاپ دیفائن بھی ہے ہمارے پاس لیکن ان کی اپنی اپنی لیمیٹیشنز تھی میکرو was a code substitution شاپ دیفائن was a value substitution یہاں پہ جو ہے یہاں پہ ہم کہہ رہے ہیں کہ جی code ایک جناریک طریقے سے لکھ لیا اور اس کی copies of the appropriate type will be generated by the compiler so this is nice this is much better than ordinary function overloading take our reverse example ہم reverse کا function لکھ کے جیسے ہی ہم program لکھیں اور اس کے اندھa کوئی بھی ڈبل دے دیتے so ڈبل کا ایک version of the reverse function will be created and compiled and used یہی template آپ کہیں اور کسی program میں دالنے اور وہاں پہ اس کو integer کے لئے call کرلیں You didn't write extra code. ہی بار بار میں repeat اس پاس دے کر رہاہوں ژاکے اس تیکنیکی اسیلنے سب کو سمجھ آجائے an therefore you start thinking in terms of templates whenever you write code و آر طریقہ اس کا یہی ہے think in کا کہ جی پہلی دفہ تو don't even think template آپ اپنے functions لکھیں اپنا کام کریں دو مهینے کے بعد جب آپ آئیں گے ایک نیا problem کر رہے ہیں ڈالے میں آپ code لکھتے لکھتے کہیں گے تھیریود یہ تو وہ ہی تھی روح بہت ہی بات تھا جو ہی چیز ہے جو کہ میں نے پہلے لکھی تھی لکھتے ہیں اور آپ پہلے پہلے پہلے پہلے لکھیں اور اس کو ٹیمپرٹائز کرتے ہیں رولز کم از کم ایک آگومنٹ ہے وہ جناریک ٹیتر ٹیپ کا ہونا چاہیے فنکشن کے اندر آگومنٹ ہے لیکن ایک سے زیادہ جناریک ٹیپ بھی ہو سکتی ہیں فنکشن کے ان کو ہم ابھی ٹھوڑی دیر میں کبر کرتے ہیں لیکن پہلے ٹی پہلے ٹی پہلے ٹی as the new ڈیٹر ٹیپ اور ایک ٹیمپرٹ ڈیٹر ٹیپ جب اسٹمال کی باری آئے گی تو ٹی کو سبسیٹوٹ کمپائلر کرے گا جنریٹ اپروپریٹ کوڈ سکتے ہیں تھوڑی سی لمیٹیشنس ہیں وہ آپ کو خیال رکھنا چاہئے یہاں پہ آپ فنکشن کی یا ٹیمپلیٹ فنکشن کی دیکلیریشن اور ڈیفنیشن کو علیدہ فائلوں میں نہیں رکھ سکتے لیکن کلاس کے سلسلے میں ہم علیدہ رکھتے تھے for a certain purpose in the case of a ڈیٹر ٹیپ کیا ہم اس کی جو دیکلیریشن ہے which means کلاس کا بیسک سٹرکتر وہ ہم ہیڈر فائل میں ڈال دیتے ہیں اور وہ ہیڈر فائل میں ڈالتے ہیں تاکہ ڈیوزرز of the class maybe other people ان کو پتہ چل جائے گی کیا کلاس جو ہے وہ کیا کچھ ڈیمپلیمٹ کرتی ہے اور پھر اس کی جو ڈیفنیشن ہے اس کے function کے ڈیٹر ٹیمپلیٹ فنکشن وہ علیدہ فائل میں کمپائل کر کے as object files or as object code ہم ساتھ سپلائے کرتے ہیں یہاں پہ کیونکہ کمپائلر نے اہلے اس کی source code کی copy بنانی ہے اور پھر اس کو object code میں لے کے جانا ہے یہ لگجری ہمارے پاس نہیں ہے we cannot give the template function کی declaration in one file and the definition in another and try to compile the definition before hand it will not compile because it is not having a real data type in there it still has a parameterized or generic data type in it so normally template functions are in one file and then you include that file or keep it with your main program when it will be used automatically copies of that code will be generated so it is a slight limitation but not much of a limitation in any case template functions they are meant for your own use you don't normally write template functions as libraries for other people because that's like giving your source code away but you don't want to do that we have already said that in the template function at least one generic data type you have to have an argument but we can actually have more than one argument so if we think in terms of the swap function for example we normally pass it references to two pieces of data on purpose I am trying to say that we don't have an int but we have to pass two pieces of data so we could write the swap function by saying template class t return so it could be a void return but within the swap argument list we would say tx,ty and then do a swap swap کے اندر جائیں کیسے لکھیں گے we would say t-temp interesting کے جی اندر بھی ہم نے ایک data type استمال کر کے ایک اپنا data variable create کیا تی تیمپ اس کی تیمپ کیا ہے چلتے وقت ٹیٹرمین ہوگی اور پھر وہی بات ٹیمپ ایکوز x x ایکوز y وی ایکوز ٹیمپ سوپ فنکشن ٹیمپلیٹ فرم میں لکھا گیا فرق کیا ہے اب اس ٹیمپلیٹ کے اندر دو آگومنٹس پاس ہو رہے ہیں اور دونوں جو ہیں وہ جناریک دیتایپس کے ہیں یہ بھی لیمٹ نہیں ہے you could actually mix native data types and generic data types when we say native data types we also have our own user defined data types which means classes لیکن پھر وہ order of declaration and definition کی بات آتی ہے but استمال کیا جا سکتا ہے اب اس سوپ کو آپ استمال کرنے لگی تو it is interesting you can now use this template version of the swap function use it for integers use it for doubles use it for characters it is very simple it will work with jars as well when it will become a copy when you will write in your main program or in any function swap a,b now if a is written above int a,b the swap will become an int version copy compile time if you have written 4 a,b then it will become a character version copy you can actually do a simple substitution 4 اٹھائے جہاں جہاں ٹی لکھا ہوئے وہاں چار لکھتے اور جو اوپر والی لین تی template last t اس کو مٹا دیں that is the function that the compiler will generate for you now we have gone from one generic argument to multiple generic arguments دو پی بھی نہیں رکنا 3,4,5 جو بھی آپ کو چاہیں اس طرح کہ آپ template functions لکھ سکتے ہیں are we limited here not yet we are not limited to using only one generic data type you can still use more than one generic data type how do we do that we do that by using the template line and extending it so we say something like template then angle brackets کے اندر ہم لکھتے ہیں class t, class u again I will reiterate this is the common usage of t and u you could write class a, class b where normally we capitalize a and b so that you can see this is the template or generic data type now you can use two different generic data types and write a template function swap normally two identical things are done but you could do ints and doubles don't do swapping do multiplication any function's requirement so you can start mixing data types and a certain or a specific example we take an example of a larger function we want to write a function that tells us which one is bigger so we say in a templatized version we say template class t it returns the larger number so the return type is also t so we say t larger tx,ty within the function you start comparing the things very simply saying or rather since we want to return the larger value let's declare a variable inside the function also of type t so we say t big big and then we say if x is greater than y big is equal to x else big is equal to y return big the larger will return the bigger of the two values in fact if you remember what I have told you it is not exactly correct because x greater than y we have treated and other things are taken in else so x equal to y actually goes in else but the answer is alright it is still the bigger of the two values or both values are equal in any case now we have a generic function ok it has one generic data type called t now let's use it we write the main function in it we say int i equal to 5,j equal to 7 on the other line we write double x equal to 10.0 y equal to 15.0 then we do c out let's display it it is less than larger i,j as soon as we write larger i,j the compiler is going to look at the template and say look i and j are integers because this larger function we need an integer version and as I have said where t is written there will be an int substitute and a version will be generated and compile compiler looks at the next line خود کیا جائے گا اور ہمتاہے ہوتا ہے کہ ہمتاہے ترینوںیں ایک نعم لے گا۔ ہمتاہے نعم لے گا اس د بلتی ساتھ ہے کہ ہمتاہے زنگارے کنے کے لئے ساتھ ہوتا ہے۔ جو ایک نعم لے گا وہ بھی خلال ہو جائے گا، now the program will run and you will اور انٹیجر اوپٹ دے دی ہے کہ لارجر انٹیجر فلانا ہے یا دبل فنکشن وہ چلا ہے اور دبل کی ویلیو آگئی ہے look at the third line which we have commented out in the code it says c out less than less than larger i comma y there's a problem اگر آپ اس کو uncomment کریں گے یہ compile نہیں ہوگا کیوں نہیں compile ہوگا i think the answer is obvious we have only defined one generic class type in the templatized function اس میں class t ہم نے دی ہے یہاں پہاں اس کو suddenly call کرنے لگ پڑے ہیں with an int and a double the compiler doesn't know what to do with it یہاں تو وہ اس کو دبل کا template استعمال کریں اور انٹ کو promote کریں into a double and then call the double version اور یہاں وہ double کو demoٹ کریں into an int when we call it and then use the int version of the function but the compiler says کیجی I'm not going to make this decision so it's an error either you give me a function that knows how to handle two different data types or you correct this line so that it uses only one data type you have to look at the slight nuances the fine points ان کا بھی شعل رکھنا پڑتا ہے the template is a nice way of doing things but don't misuse them typically compiler will not allow you to misuse them وہ وہیں پے trap کر لگا so then you think about it and you look at the function inside I'm making a wrong use of this template اس کی template کا استعمال اس طرح سے ہوتا ہے ایک ہی کسم کے دونوں دیتا ہے اس کو pass کرنے ہیں at least for this larger function اس Nitin ہم نے функ poison overloading پری گتی تھی اور every function overloading کی Glenn اندر ایک ٹیکنی کیے تھی کی جیگر ایک ہی function کا نام ہو لیکن اس کی argument list you have would difference ہو different ہو in the type of arguments data type different ہو یا number of arguments pass to that function are different then you can use the same name خط 有، آرہ کی ناہت حامات interface سی ہے کیا jouer آئے کیا نہیں ہے کیا وحیتی ہے اسے when you're overloading functions now if the number or type of the arguments is different you can use a function with the same name right two separate versions and automatically the correct version will be called we can do the same with template functions so you can now use two ایک نمبر ایک نمبر یا ایک نمبر ایک ایک نمبر سی بہت ایک نمبر اور وہ بہت سکتے ہیں سمپل اگر کہ جی وہ سوپ ہم نے فنکشن لکھا تھا اس کی جگہ پہ ہم اس کا نام رکھتے تھے انورس اور انورس جو ہے وہ سوپ بھی کر سکتا ہے اور ریورس بھی کر سکتا ہے جو ہم دو فنکشن بات کرتے ہیں جب ہم اپنے انورس فنکشن کو دو چیزیں ایک ہی دیٹر طاپ کی پاس کریں گے وہ ان کو انورٹ یا سوپ کر کے ہمیں واپس دے دے گا جب ہم انورس فنکشن کو ایک چیز پاس کریں گے تو اس کا نگیٹف وہ ہمیں واپس دے دے گا so we write two different templates the first one for the انورس فنکشن is template class t اور پھر بیشک void رکھلیں بیشک t رکھلیں دیٹر طاپ but void انورس t x comma t y بلکے کیونکہ ہم سوپ کرنا چاہر ہیں تو reference دینا پڑے گا so it is more like t and x comma t and y and x and y are references to a دیٹر طاپ t اور پھر اندر t تمپ تمپ equals x x equals y y equals تمپ and that's it یہ ہمارا سوپنکشن جو ہے انورس کے نام سے لکھا گیا اس کو دو تو آپ اپنے اتنے ہم بہنوان سموڈ ایک ہر جائے ہیں دوسری تمپ نکتے ہیں تمپلے طلاپ t t انورس t x اب اس کو ایک آگمینٹ دیا جا رہا ہے اور پھر اس کے اندر ہے return minus x سب پر سوپ پر تران تاپی ہے وہ تی ہے لیکن what I mention look ڈا لیا and that's a rule سانٹاس مبالوڈیٹ فنکتنس ایک لئے اس کے مجھے سے ایک آگومنت لکھا ہے یہاں ہم نے سوپ کے لئے کہدھی اور ریٹون کچھ نہیں کرتا ہے اور جو سنگل آگومنت والے تیمپلٹ ہے وہ بلکتی تییٹ رہا ہے یہ ہماری تیمپلٹز بن گئی اب آپ پرگم جب لکھتے ہیں ان کو استعمال کرنے کے لئے اگر آپ کوئی بھی چیز لکھیں گے انورس اینام کے ساتھ کہ انورس فنکتن ہے اور آگے آپ دو پیرمیٹرز دے دیتے ہیں لیکن اینٹ آئی کوما جی اور اینورس آئی کوما جی تو دو آگمنٹ سوالہ ٹیمپلٹ جو ہے اس کا ایک ورزن جنریٹ ہوگا جو ان کو سوپ کرے گا اپس میں اور اگر آپ لکھ دیتے ہیں اینورس آئی تو جو سنگل پرامیٹر والا فنکشن تھا اس کا انٹیجہ ورزن جنریٹ ہوگا اور وہ آئی کی نگیٹی ویلیو واپس کرے گا now we have overloaded a template now again وہی جو overloading کی جسٹیفکیشن تھی کہ جی code پڑھا جاتا ہے code سمجھ آ جاتا ہے it makes things more uniform وہی argument یہاں پہ اپلائے ہو سکتی ہے لیکن not in the example i have given i think کہ اگر میں اگر سوپنگ کیلئے فنکشن لکھ رہا ہوں تو میں اس کو نام ہی سوپ دوں گا اور اگر میں نے کوئی نمبر کو انورٹ کرنا ہے بلکہ اس کا reverse لینا ہے یا نگیٹیب لینا ہے تو میں زیادہ اچھا کوئی نام چوز کروں گا for example i may use negative as the name why because invert you have somehow implies one over x negative really implies negative so i would use that so i would not use overloaded templates but they would be other places where you might want to overload templates and وہاں پہ یہ ٹیکنیٹ جو ہے وہ کاماتی ہے اور اس کے اندر جو خیال رکھنے والی بات ہے وہی overloading rules templates کو بھی اپلائے کرتے ہیں to differentiate between overloaded templates the number and or type of the arguments must be different template functions کے اندر کئی دفعہ یہاں ہوتا ہے کہ ہم force کرنا چاہتے ہیں کہ جی کونسا version function کا استعمال ہو جو ہم نے یہی reverse function جو تھا ہمارا یہ لکھا ہوا ہے اور اس کو call کر لی ہے double کے لیے so template would have been generated for a double or اس کا negative value return ہو جائے گی program کی اندر they can suppose we want to pass it a double but return an integer we want to return a negative integer that is part of the double variable that was passed to this function اس کو ہم force کر سکتے ہیں کمپائلر کو کہ جنا بھی ایک integer version بھی اس کا generate کر دو حلہ کہ انٹر ہم کہیں اس کو pass نہیں کرنے لگی اس کا طریقہ یہ ہے جب function call آتی ہے program کے اندر جب ہم function لکھیں کہ اس کو call کرو reverse کا function call کرو ہم function کے نام اور اس کی argument list کے درمیان angle brackets کے اندر data type لکھتے ہیں so for example اگر ہمار پاس ایک template version ہے اس کا reverse function کا which returns minus x program کی اندر ہمارے پاس ہے double a or a is equal to 10.75 or whatever value we want to give it ہم لکھتے ہیں reverse a as soon as the compiler reads this line اس نے ایک double version جو ہے of the template وہ تو generate کر لیا لیکن آگے جاکے میں چاہتا ہوں کہ یہ reverse کا a ہی pass ہو لیکن یہ return مجھے integer کرے اس کی definition دیکھیں it was t reverse tx so I want t to be replaced by an int but I want to pass it a double what we do is we say within the main code we say reverse angle brackets may int or پھر as an argument we pass it a which is the double what this does is writing the int in angle brackets forces the compiler to also generate an integer version of the same function once that has done that means you can now actually force a usage I mean think about it مطلعا تھوڑسہ contrite بات آجاتی where would we want to do that but they will be instances where this تکنیک would be useful let's go on a little and look at two different arguments and you will discover کیجناب یہ forcing کئی دفعہ کام آجاتی ہے suppose we have a template جو کہ اب دو generic ڈیٹا تائفس پر ڈیپینٹ کر رہی ہے so first of all the template line will be template کلاس تی کمہ کلاس جو اگین یاد رہے تی اور جو ہم نے نام دیے ہیں اس کے بعد میں کرتا ہوں کیجناب اس کی ریٹرن تی پہل بھی تی اور اس کا آرگومنٹ جو پاس ہو رہا ہے that is of ڈیپ یو سو تی and you are both being used in the function ڈیکلوریشن let's again say تی ریورس ڈیپینٹ جو تی اور آرگومنٹ جو تی اور پھر اندر اس کے ہم کیا دیتے ہیں ڈیٹرن ڈیپینٹ سو اٹمیٹکلی بھی آسکیں گی to do a conversion اب دیکھیں یہ فنکشن ڈیپینٹ جو ہے اس میں دو جناریک ڈیپس استعمال ہو رہے ہیں the return ڈیپ کانٹ really force anything overloading ڈیپینٹ ہے کہ جی ڈیپ کیا آپ کچھ فورس نہیں کر سکتے وہ تو باد میں assignment میں استعمال ہوتی ہے لیکن اب اگر ہم within the program we have something like double a اور ہم کہتے ہیں reverse a کنسا version ڈی کیا ہے یو کیا ہے now we can start forcing it so we say this reverse within angle bracket we say int and we say a in that case what will do is it will force t to become an int and it will force you to become of the type a which means a double so it will take a double اس کا نگیٹف نمبر جنریٹ کرکے it will convert it to an integer and pass it back you can explicitly specify reverse int comma double will be angle brackets کے اندر so we say reverse angle brackets int comma double don't know t or u اپنے specify کر دیے یہ ہم specify کر رہے ہیں compiler کو so that when the compiler generates the code it generates it for these versions اور پھر اس کو a پاس کر دیا obviously جیسے ہم نے پہلے بھی default arguments کی بات کی you can't just force the second part یعنی تی کو miss کر دیں اور you کو force کر لیں وہ نہیں ہو سکتا it has to go left to right but you can go reverse double comma double you can go reverse double comma int and the appropriate versions will be generated so you can actually force کیا آپکے کوڑ کے اندر کن کنسے versions you can template کے وہ generate ہوں this I said again for the sake of completeness نمالی force ہم کم کر رہے ہوتے ہیں normally force ہم کم کر رہے ہوتے ہیں normally یہ ہے کہ یہ ٹیمپلیٹ بنائی ہے this is a template that we have made اور اس کا straight forward use ہوتا ہے for multiple or different data types and the appropriate versions are generated by the compiler question is ہم نے template functions بنا لیے اور ہمیں پاتا ہے کہ classes کے اندر member functions ہوتے ہیں and we know that there are member functions in the classes can we use these templates with member functions of a class آنسر is yes you can templatize the member functions also پر اس کے اندر ایک چیز کا خیال رکھنا پڑتا ہے but you have to take care of one thing خیال یہ رکھنا پڑتا ہے کہ جو بھی template function جو operation implement کرے وہ پھر کلاس کے public interface میں operation موجود ہونا چاہیے تاکہ کوئی ارر نہ آئے so that there is no error سیمپل ایک example کو ہم دیکھتے ہیں یا آپ کو code بھی ملاؤ گا ہے simple an example we see here سپوز ہم نے ایک class create کی ہے called phone call اور phone call کلاس کے اندر ہم نے data members رکھتی ہے جو کہتے ہیں کہ جی ایک تو اس کی length ہے کتنی لمبی call کی so it can be an int or it could be a double normally a double would do so a double length of call اور ساتھ اس کا ہم نے ایک code رکھتی ہے billing code let's say bill code which is a character اور bill code بتائے گا کہ جناب یہ call was international انٹرنشنل تھی لوکل تھی دمیسٹیک تھی کس کسم کی call تھی اور تھوڑا سا آگے سوچ دے بھی ہم کہتے ہیں کہ جاہر مجھے جب phone کا bill آتا ہے ہم دیکھتے ہیں bill کو اور کہتے ہیں یہ call غلط ہے یہ bill نہیں ہونی چاہیے تھی what do we do we pick up the phone and call the phone company اور we normally go to the phone office and say کہ جی ہمارا bill غلط ہے اس کو تھی کر دیں تو وہ تھی کسے کرتے ہیں سوچیں کوئی لفس آج کے لیکٹر میں ہم نے استعمال کیا ہے وہ وہاں پہ وہی کر رہے ہوتے ہیں کہتے ہیں اچھا جی یہ نہیں ہے call اپنا record دیکھا یہ تو 3 سیکنٹ کی call تھی that means کہ آپ کی بات ہوئی نہیں ہے اور ہم نے آپ کو bill کیا بھی 3 منٹ کے لیے تو اس کو ہم reverse کر دیتے ہیں so again I'm using the word reverse because we've discussed the reverse function اور reverse میں ہم کر کیا رہے تھے ابھی تک ہم minus x کر رہے تھے now we said in the template version of the reverse function whatever we pass it اس کو minus x کر کے وہ واپس کر دے گا یہاں پہ ہم کرنا کیا چاہے ہیں phone call کو reverse کرنا چاہے ہیں suppose ہم define کر دیتے ہیں کہ جی bill code equal to c جب ہوگا that means the call has been reversed cancelled can we now use this concept and define a reverse function which will work for this class the function template وہی رہتی ہے اگر ہم اس template کو revisit کرتے ہیں دیکھیں ہم نے کیسے لکھا تھا ہم نے کہا تھا template class t t reverse tx t is the data type x is the variable اور اندر ہم نے کہا تھا return minus x اگر یہ ہم return کر رہے ہیں تو reverse کو ہم t کی جگہ پہ as an int یا ڈبل یا float کی بجائے object pass کر سکتے ہیں of type phone call اور اگر object pass کر دیں گے how will that work پہلے تو آپ conceptually یہ دیکھیں یا کاغص پے کر کے دیکھیں کہ یہ t کی جگہ پہنہ phone call لکھیں پھر کیا ہوتا ہے now it says phone call reverse phone call x and then it says return minus x so declaration line تو تھیک ہو گئی کہتی ہے it will return an object of type phone call and it expects in the variable x an object of the class phone call رہ گئی بات اندر کی کہ یہ return minus x کیا ہو گا what will be minus a phone call اس کے لیے جیسے میں نے بار جہاں شروع کی کہ جب کلاسز کے اندر استعمال کر رہے ہوتے ہیں we have to make sure that جو بھی function یا usage implement کی جا رہے ہے template function کے اندر اس کی support کلاس کے اندر موجود ہو یہاں پہ ہم minus x لکھنا چاہ رہے ہیں تو ہمیں چاہیے کہ جی ایک operator minus جو ہے وہ phone call کلاس کے لیے دیفائن کیا ہو یاد رہے کہ جو operator minus تو ہم دیفائن کر سکتے ہیں we know how to define operators for classes لیکن in this case phone call کی لیے جو operator minus ہوگا وہ کیا کرے گا وہ اس کا bill code بدل کے ایک object وپس کر دے گا of type phone call اور bill code کو وہ see کر دے گا cancelled so let us take a look at the code itself and see how we do this phone call کی کلاس کے اندر ہم operator overload کرتے ہیں minus کا or minus operator کی اندر جائیں دیکھیں تھوڑا سا spirit رکھنا چاہیے operators کا ہم نے پہلے بھی بات کی whenever we are overloading operators we cannot change their binary or unary nature minus is lucky کیونکہ وہ دونوں میں کام کرتا ہے binary بھی ہے unary بھی ہے so we minus x کر سکتے ہیں minus کے اندر کیا کرنا چاہیں گے remember کہ operator when we are defining an overloaded operator is nothing but a function so we can do whatever we want in the function here is a classic example جہاں پہ ہم actually کسی چیز کا negative نہیں لے رہے لیکن اس کا کچھ مطلب استعمال کر رہے ہیں you need reversing a phone call so if you look at the code what we say is we define a temporary variable of type phone call we say phone call temp or temp کو ہم initialize کر لیں اگر copy constructor ہے with the variable that was calling it یعنی x جہاں پہ آئے گا اس سے ہم اس کو initialize کر لیتے ہیں in the meantime we say temp کے اندر ہم نے length of call بھی place کر لی or bill code بھی لکھ لیا لیکن ہم اب temp کا bill code بدلنا چاہ رہے ہیں what we do is that in the minus function or the minus operator function of the class ہم کہہ دیتے ہیں temp.bill code equals single codes کندر c so جو ہم نے ایک phone call type variable create کیا جس میں باقی چیزیں phone call جو پاس ہوئی تھی اس کی values copy کر لیں لیکن اس کا bill code بدل دیا and return temp so we return an object of type phone call out of this minus function اس کو combine کریں اس template کے ساتھ you realize کیجی reverse کے ساتھ ہم نے لکھا تھا return type is t we said t reverse tx یہ والی line implement ہو جائے گی اگر minus operator class کا جو ہے وہ بھی object of type phone call return کرے and it also accepts an object of type phone call since it's a member operator object of type phone call تو اس کو مل رہی ہے all we've done with the return temp statement is we've returned an object of type phone call اب ہم آجاتے ہیں اپنے main program کی طرف main program میں ہم کہتے ہیں phone call a اور a کے اندرہ بیشک length of call اور bill code b کر کے اس کو initialize کرنے it's a constructor لکھا ہوا ہے اس کے طرف ہم نے initialize کر دیا اب آپ بیشک a.display کر لے ہم نے ایک display function بھی لکھا ہوا کہتے ہیں length of call اتنے منٹ bill code b or whatever i for international جو بی اس میں value ہو اس کے بعد ہم کہتے ہیں reverse a now reverse a جو ہے it is again in the spirit of programming you have to think reverse should not be changing a but we say it is returning an object of type a so what we say is a is equal to reverse a so جو بھی اس کو object pass کیا اس کو اس نے reverse کیا اور واپس ایک object دیا اس کو ہم نے assign کر دیا واپس phone call object a کے اندر and reverse function جو ہے وہ ہمارا template والا call ہوگا i.e template will be generated for an object or a class type phone call وہ اندر سے minus x جب کرے گا وہ class کا member operator minus call ہو جائے گا وہ جو بھی اس کو object دیا گیا ہے اس کا bill code بدل دے گا جو بھی bill code تھا اس کو c کر کے اس نے واپس کر دیا ہم نے لکھا a is equal to reverse a تو جو object return ہوا with the bill code c وہ اب a کے اندر assign ہو گیا آپ پھر a.display کریں آپ کو پتہ چلے گا کہ یہ phone call جو تھی جس کی duration اتنی تھی اس کا bill code c ہو گیا so reverse works let us just recap what we did with this whole operation ہم نے ایک template function ہم نے reverse define کیا اور وہ وہی reverse ہے جو اس لیکچر کے دوران ہم استعمال کرتے ہیں کہ یہ template کے اندر وہ return کرتا ہے minus x جو بھی x اس کو پاس کیا جائے اس کے بعد ہم نے ایک class لکھی ہماری phone call class اور اس کے اندر ہم نے اس کا operator minus define کر دیا کہ جب بھی phone call کو minus کیا جائے تو یہ action لینہ action ہم نے define کر دیا this is now based on the domain in which we are working so we are working in the phone call domain so we say when we reverse a phone call اس کا bill code ہم c کر دیں گے so minus operator وہ اس کا return یا bill code c کر کے ایک object of type phone call return کرتا ہے یہاں تک یہ دونوں independent exercises تھی phone call جو لکھی ہی class ہماری اس کو reverse کا کچھ نہیں پتا اس نے تو اپنا operator minus define کیا ہے on the other hand the template function reverse has been written as a template it knows nothing about the phone call class ان دونوں چیزوں کو جوڑ کیا چیز رہی ہے ہمارا main function main function یا کوئی اور اس کا sub function جو ہے اس نے کیا کیا ہے it declared an object of type phone call and then called the reverse function with that object so when we wrote that line saying a equals reverse a automatically compiler detects hey wait a minute what we've got a situation جہاں پہ reverse function template جو ہے وہ call ہوری ہے with an object of type phone call if it has been called with that thing I need to generate a copy of the template function that will work with phone calls وہ جب اس کو جنریٹ کرنے جاتا ہے تو بیچ میں ایک لائن آ جاتی ہے return minus x it has to know that a minus operator exists for that class phone call class کیلئے اگر وہ نہیں ہوتا تو کیا ہوگا now in certain instances it may be an error so the compiler will say hey I do not know how to do minus phone call on the other hand کئی دفعہ یہ بھی ہو سکتا ہے کہ یہ default substitution ہو جائے and the default substitution may not be what you want it to do so you have to be careful and look at the implications of using a template function with a class and make sure کہ جو function وہ جو بھی operations کرتا ہے وہ class کیلئے علیادہ سے defined ہوں تاکہ وہ template functions کیلئے یہی طریقے سے کام کر سکے but once this is done you realize that life has become simpler وہی reverse function اب اس کیلئے کام کرتا ہے and now you can extend the concept and say کہ جی کار کو reverse کیسے کرنا ہے phone call کو reverse کیسے کرنا ہے integer کو reverse کیسے کرنا ہے or you are not limited by your imagination I mean go for it the idea is we are combining two very powerful techniques one is operator overloading for this example but nonetheless function overloading تو ہے ہی اس طرف ہمارے پاس ایک template mechanism آگیا جو کہتا ہے جی کوڈ اب ایک دفعہ لکھنا ہے normal overloading کے اندر facility یہ تھی کہ جی ایک ہی نام ہم بار بار استعمال کر سکتے ہیں لیکن جتی دفعہ ہم استعمال کرنا چاہتے ہیں اتنی دفعہ ہم کوڈ بھی لکھ رہے تھے and normally the code was slightly different display function for class آگیا will be different from a display function for class b and so on that's overloading in this case we are saying اگر code identically لکھنا ہے دو نمبر کو interchange کرنا ہے کسی چیز کو negative کرنا ہے and so on so forth if it's the same type of code and only the data type changes then we should go and define a template for that function or template بار بار استعمال ہو we started out by using جس the template function concept which is used at your program level and then we went on and showed how a template could be used within a class لیکن اس جو کمبینیشن ہے اس کمبینیشن کی کچھ لوازمات ہی جو میں نے آپ کو explain کی جناب جو بھی operation یا template function implement کرے وہ class کے اندر defined ہونا چاہیے otherwise you will have problems that is it for today what we'll cover next time is template classes اس کو آپ ذرا سوچیں اور دیکھیں concept کو زیادہ different نہیں ہوگا جہاں پر template function ہو سکتے ہیں کہ آپ وہاں پر template class نہیں ہو سکتی so till next time دا ہفز