ماڈیول اسباق (2/2)
کلاس ٹیمپلیٹس
فنکشنز کی طرح، کلاسز کو بھی ایک یا زیادہ ڈیٹا اقسام کے حوالے سے پیرامیٹرائز کیا جا سکتا ہے۔ یہ ہمیں عام ڈیٹا ڈھانچے کی وضاحت کرنے کی اجازت دیتا ہے (جیسے فہرستیں، قطاریں، اسٹیک، یا ریپر) جو ڈپلیکیٹ کوڈ کے بغیر کسی بھی ڈیٹا کی قسم کے ساتھ کام کرتے ہیں۔
کلاس ٹیمپلیٹ کی تعریف
کلاس ٹیمپلیٹ کا اعلان کرنے کے لیے، ہم کلاس ڈیفینیشن سے فوراً پہلے template <typename T> نحو استعمال کرتے ہیں۔ کلاس کے اندر، ہم ممبر کے متغیرات، واپسی کی اقسام، یا ممبر فنکشن پیرامیٹرز کی وضاحت کے لیے ٹائپ پیرامیٹر T استعمال کر سکتے ہیں۔
template <typename T>
class Box {
private:
T value;
public:
Box(T v) : value(v) {}
T getValue() const {
return value;
}
};انسٹی ٹیشن
کلاس ٹیمپلیٹ کا ایک آبجیکٹ بناتے وقت، ہمیں واضح طور پر زاویہ بریکٹ <> کے درمیان قسم کی وضاحت کرنی چاہیے (اگرچہ C++17 سے شروع ہو رہا ہے، مرتب کرنے والا اسے Class Template Argument Deduction یا CTAD کے ذریعے کچھ سیاق و سباق میں اخذ کر سکتا ہے):
Box<int> intBox(10); // T becomes int
Box<double> doubleBox(3.14); // T becomes doubleٹیمپلیٹ اسپیشلائزیشن
بعض اوقات ہم کلاس ٹیمپلیٹ کے لیے ایک مختلف طرز عمل چاہتے ہیں جب اسے کسی مخصوص قسم کے ساتھ فوری بنایا جاتا ہے۔ اس صورت میں، ہم template <> نحو کا استعمال کرتے ہوئے ایک کل تخصص کی وضاحت کرتے ہیں جس کے بعد کلاس کی تعریف ہدف کی قسم کی وضاحت کرتی ہے:
// Total specialization for the bool type
template <>
class Box<bool> {
private:
bool value;
public:
Box(bool v) : value(v) {}
void printState() {
std::cout << (value ? "True" : "False");
}
};خود ہی آزمائیں۔
باکس کے نام سے ایک کلاس ٹیمپلیٹ کا اعلان کریں جس میں ایک پرائیویٹ ممبر نام کی ویلیو ٹائپ T، ایک کنسٹرکٹر جو اسے شروع کرتا ہے، اور ایک عوامی طریقہ getValue() const پر مشتمل ہے جو قدر واپس کرتا ہے۔
اشارہ دکھائیں۔
`ٹیمپلیٹ <ٹائپ نام T>` کو `باکس` کلاس ڈیکلریشن سے پہلے جوڑنا یاد رکھیں۔
3 کوششوں کے بعد حل دستیاب ہے۔
ایک کلاس ٹیمپلیٹ ریپر<T> کا اعلان کریں جس میں پبلک ممبر ڈیٹا ٹائپ T، کنسٹرکٹر ریپر (T d) اور پرنٹ() طریقہ ہے جو ڈیٹا کو std::cout پر پرنٹ کرتا ہے۔ اس کے بعد، Wrapper<char> کے لیے ایک کل تخصیص بنائیں جہاں پرنٹ() طریقہ واحد کوٹس میں بند کریکٹر کو پرنٹ کرتا ہے (جیسے، A کی بجائے 'A')۔
اشارہ دکھائیں۔
`ریپر<char>` کی کل تخصص کی نشاندہی کرنے کے لیے `ٹیمپلیٹ <>` استعمال کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔