✤  قالب‌ها در ++C

یکی از امکانات جالب و مفید زبان ++C قالب‌ها (Templates) هستند که انعطاف زیادی به کدنویسی می‌دهند.

فرض کنید در یک برنامه نیاز به تعویض مقادیر دو متغیر هست. یعنی مثلا می‌خواهیم مقادیر a و b را با هم عوض کنیم. اگر a و b از نوع صحیح باشند، تابع جابجایی می‌تواند به این صورت باشد:

  

void swap(int &a, int &b){

  int temp;

  temp = a;

  a = b;

  b = temp;

}

  

حال اگر بخواهیم مقادیر دو تا متغیر اعشاری را عوض کنیم، تابع فوق به کار نمی‌آید و باید تابع جدیدی بنویسیم. اما اگر از قالب استفاده کنیم، همه مشکلات حل می‌شوند.

به قطعه کد زیر توجه کنید:

  

template< class T >

void swap(T &a, T &b){

  T Temp;

  Temp = a;

  a = b;

  b = Temp;

}

  

این کد روش استفاده از قالب را نشان می‌دهد. وقتی کامپایلر به این قطعه کد می‌رسد، متوجه می‌شود که یک تعریف کلی از یک تابع ارائه شده است. به جای T می‌توان در زمان فراخوانی تابع، هر نوع داده استاندارد، ساختمان یا کلاس استفاده کرد. به عنوان مثال:

  

int n = 5, m = 6;

double x = 0.12, y = 125.6;

char a = 'A', b = 'B';

swap(n, m);

swap(x, y);

swap(a, b);

cout << " n = " << n << ", m = " << m << endl;

cout << " x = " << x << ", y = " << y << endl;

cout << " a = " << a << ", b = " << b << endl;

  

خروجی:

  

n = 6, m = 5

x = 125.6, y = 0.12

a = B, b = A

  

به عبارت ساده‌تر، وقتی کامپایلر به کد

swap(n, m)

می‌رسد، متوجه می‌شود که باید T را int در نظر بگیرد و ...

همانطور که گفته شد، می‌توانید برای اشیاء کلاس‌ها و ساختمان‌ها هم از قالب استفاده کنید. اگر strval1 و strval2 دو متغیر از نوع ساختمان دلخواه باشند، عبارت

swap(strval1, strval2)

کاملا درست بوده و باعث جابجایی متغیرهای متناظر ساختمان‌ها می‌شود.

قالب‌ها از تمامی امکانات ++C نظیر سربارگزاری، تعریف مجدد و پارامترهای پیش‌فرض پشتیبانی می‌کند. مهم‌تر از همه این که می‌توان از قالب‌ها برای تعریف کلاس‌ها استفاده کرد:

  

template< class T >

class myclass{

  private:

    T a;

  public:

    myclass(T x){

      set_a(x);

    }

    T get_a(){

      return a;

    }

    void set_a(T x){

      a = x;

    }

};

  

با توجه به تعریف فوق، برای مشخص کردن اشیاء می‌توان نوشت:

  

myclass<int> n(7);

myclass<float> d(10.5);

  

توجه داشته باشید که لازم نیست همه متغیرها از نوع کلی باشند. تابع زیر را در نظر بگیرید که یک آرایه و تعداد اعضای آن را دریافت کرده و این اعضا را چاپ می‌کند:

  

template< class T >

void print(T *arr, int n){

  int i;

  for (i = 0 ; i < n ; i ++)

    cout << *(arr + i) << endl;

}

  

در ضمن می‌توان به جای یک نوع کلی، از چند نوع استفاده کرد:

  

template< class type1, class type2, . . . , class typeN >

  

از کاربردهای دیگر قالب‌ها می‌توان به توابع مرتب‌سازی، توابع جستجو، پشته‌ها، لیست‌های پیوندی، درخت‌ها و صف‌ها اشاره کرد.

مسعود اقدسی فام

مسعود اقدسی فام هستم.

دانش‌آموخته‌ی علوم کامپیوتر و فعال حوزه‌های علم داده و یادگیری ماشین؛ علاقه‌مند به یاد دادن و یاد گرفتن :)

algs.ir/spa7yei     اشتراک‌گذاری در LinkedIn     اشتراک‌گذاری در Twitter     ارسال با Telegram
نوشته‌ها از این دست
آخرین نوشته‌ها
       ✦   الگوریتم آنلاین
نوشته‌های پرمخاطب
  • 1
  • 2
  • 3
  • 4
  • 5

نام: *  

پست الکترونیک (محرمانه):

متن پیام: *  

01 02 06 07 08 09 10 11 12 13 14

• hamed
جمعه، ۲۹ تیر ماه ۱۳۸۶، ساعت ۰۴:۴۶

سلام من نمیدونم بلدی یا نه اگه میتونی با دو تا متغیر عمل جابجایی رو انجام بده خوشتیپ من انجام دادم

• احسان
شنبه، ۲۴ آذر ماه ۱۳۸۶، ساعت ۲۲:۳۲

سلام.خسته نباشيد.واقعا سايتتونحرف نداره...فقط اگه ممكنه يكم در مورد درخت هاي Heap  توضيح بدين

• mahdi
سه‌شنبه، ۱۶ بهمن ماه ۱۳۸۶، ساعت ۲۲:۵۲

با سلام

خوب بود.

ضمنا خودم هم دانشجو هستم.

خداحافظ

M.A

• آنا
جمعه، ۲۲ آبان ماه ۱۳۸۸، ساعت ۱۲:۲۰

واقعا ازتون ممنونم.خسته نباشین

شنبه، ۲۳ آبان ماه ۱۳۸۸، ساعت ۱۸:۱۳
• مسعود اقدسی فام

مرسی. من هم از لطف شما ممنونم.

• گلناز
سه‌شنبه، ۵ بهمن ماه ۱۳۸۹، ساعت ۱۹:۱۹

سلام یه مقاله کامل در مورد ساختار  template  در ++cسراغ ندارین؟یا آدرس سایت یا وبلاگی در همین رابطه؟با تشکر

جمعه، ۸ بهمن ماه ۱۳۸۹، ساعت ۱۵:۲۸
• مسعود اقدسی فام

نه متاسفانه.

• مهدی م
جمعه، ۱۳ دی ماه ۱۳۹۲، ساعت ۱۶:۴۸

سلام

منظور از& ک درتابع استفاده کردید چیه--->(swap(&a,&b

دوشنبه، ۱۶ دی ماه ۱۳۹۲، ساعت ۱۶:۲۸
• مسعود اقدسی فام

از این کاراکتر برای مشخص کردن متغیر مرجع در زمان تعریف متغیر استفاده می‌شه. در مورد متغیرهای مرجع مطلب جداگانه‌ای روی سایت هست.

• فاطمه سادات
شنبه، ۳۰ فروردین ماه ۱۳۹۳، ساعت ۱۱:۵۱

به نظرم خیلی ناقص بود..

به هر حال ممنون

• Arash
دوشنبه، ۲۰ مرداد ماه ۱۳۹۳، ساعت ۱۹:۰۵

سوال،،

چگونه میتوان از یک کلاس با خاصیت تمپلیت یک .ارایه از اشیایی ساخت که مثلا اگر آن آرایه دارای 3 اندیس باشد اندیس اولش از نوع بولن دومش از نوع اعشار و سومش از نوع عدد صحیح باشد؟

من خودم بلدم یک آرایه از یک کلاس تمپلیت تعریف کنم ولی فقط میتونم آرایه هایی رو تعریف کنم همه اشیا اون از یک نوع و یک جنس هستن.... مثلا یک آرایه با 10 اندیس که همه اون اندیس ها از نوع بولن هستن..... وقتی که میخوام هر اندیس نوع خودشو داشته باشه کامپایلر خطا میده که لیست آرگومان های کلاس تمپلیت ناقصه!!! بعد از یک ماه جستجو فهمیدم که باید برای همچین شرایطی برای لیست از یک استراکچر استفاده کرد.... اما چطور نمیدونم..... امیدوارم که راهی برای حل این مشکل باشه....

• یلدا
شنبه، ۱۹ اردیبهشت ماه ۱۳۹۴، ساعت ۱۰:۳۷

کوتاه و مختصر

عالی بود

0612

• ساسان
شنبه، ۱۵ اسفند ماه ۱۳۹۴، ساعت ۰۹:۲۱

واقعا ممنون واقعا ممنون

عالیه این سایت121212

• سیدرضا بازیار
جمعه، ۲۴ اردیبهشت ماه ۱۳۹۵، ساعت ۰۸:۴۵

ممنون

استفاده کردم