الگوریتمستان - قالب‌ها در ++C

آشنایی با قالب‌ها به عنوان یکی از امکانات متمایز ++C از 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 >

  

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


نسخه‌ی اولیه‌ی این نوشته از وبلاگ برنامه‌نویسی و طراحی الگوریتم به الگوریتمستان منتقل شده است.

تا کنون ۴۰ امتیاز ثبت شده
نوشته لایک نداشت؟
 
به اشتراک گذاری نوشته

amasoudfam.ir/l/a7yei

اشتراک‌گذاری در LinkedIn     اشتراک‌گذاری در Twitter     ارسال با Telegram

نام: *  
پست الکترونیک (محرمانه):
پیام: *  
• hamed
۲۹ تیر ۱۳۸۶، ساعت ۰۴:۴۶

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

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

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

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

با سلام

خوب بود.

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

خداحافظ

M.A

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

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

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

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

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

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

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

نه متاسفانه.

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

سلام

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

۱۶ دی ۱۳۹۲، ساعت ۱۶:۲۸
• مسعود اقدسی‌فام

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

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

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

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

• Arash
۲۰ مرداد ۱۳۹۳، ساعت ۱۹:۰۵

سوال،،

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

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

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

کوتاه و مختصر

عالی بود

0612

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

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

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

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

ممنون

استفاده کردم

• مجتبی
۱۰ فروردین ۱۴۰۳، ساعت ۰۰:۰۸

سلام ، برای تعریف متغیر از نوع flash ک در زبان c اینگونه میباشد مثل flash char a

در زبان c++ چگونه تعریف می‌شود، لطفا راهنمایی کنید

۱۰ فروردین ۱۴۰۳، ساعت ۱۵:۰۰
• مسعود اقدسی‌فام

سلام

ما کلمه‌ی کلیدی flash رو در زبان c استاندارد نداریم. اگر مربوط به کامپایلر یا کاربرد خاصی هست توضیح بیشتری بدید که کجا چنین کدی رو دیدید.