template در ++C - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

template در ++C

+1 امتیاز
template چیه؟ :/‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌
سوال شده مرداد 20, 1393  بوسیله ی MaGaroos (امتیاز 658)   11 18 36
دوباره تگ گذاری شد مرداد 28, 1393 بوسیله ی BlueBlade
template کمک می‌کنه همزمان چند تابع و چند کلاس مسابه رو با یه کد بنویسم. (البته تعداد بستگی به تعداد به کارگیری داره) ظاهرا در C++‎ در فایل اجرایی اثری از template باقی نمی‌مونه. (C++11 رو نمی‌دونم).
کسی می تونه یه مثال راه انداز برنه!؟

1 پاسخ

+5 امتیاز
 
بهترین پاسخ

template یک روش هست برای این که توابع و کلاس ها روی انواع متقاوت کار کنن (generic programmin )

نحوه تعریف template  برای کلاس ها به شکل زیره :

template<class Type1,class Type2,...>
class Class_Name{};

مثلا فرض کنید می خواهید یک کلاس ساده داشته باشید که یک متغیر با نوع داده نامشخص داخلش ذخیره بشه به شکل زیر این کار قابل انجامه :

template <class Type>
class Data
{
public:
	Type a;
};

برای ساختن شی از template class :

Class_Name<Type> variable_name;

مثلا برای کلاس بالا برای ساخت یک شی که متغیر int داخلش ذخیره میشه :

Data<int> a;

یا برای ذخیره string : 

Data<string> b;

کاری که کدهای بالا می کنن اینه که میان به ازای هر نوع ورودی زمان کامپایل برنامه یک کلاس جدید میسازن بجای Type نوع قرار داده میشه مثلا :

class Data1{int data;}
class Data2{string data};

یعنی template صرفا یک جور جایگزینی زمان کامپایل برنامست .

template class ها می تونن بیشتر از چند نوع ورودی هم داشته باشند مثلا همون مثال Data با این تفاوت که این جا نیاز داریم 2 توع متفاوت را داخل کلاس ذخیره کنیم :

template<class Type1,class Type2>
Data
{
      Type1 a;
      Type2 b;
}
Data<int,double> data;//a int tarif mishe b double
Data<string,int> data2;//a string tarif mishe b int
...

یک مثال دیگه میتونه کلاس vector باشه که به همین شکل استفاده میشه :

std::vector<int> a;
std::vector<double>b;

علاوه بر کلاس ها توابع رو هم میشه بصورت template تعریف کرد

نحوه تعریف function template به شکل زیره :

template<class Type1,class Type2,...>
return_type func(inpute_types);

 مثلا فرض کنید که یک تابع خیلی ساده میخواهید بنویسید که 2 تا متغیر از نوع نامشخص بگیره و با هم جمع بزنه :

template<class Type>
Type sum(Type a,Type b){
    return a+b;
}

تابع بالا به شکل های زیر میشه ازش استفاده کرد :

int s = sum(2+5);
double s= sum(1.343+5.5);

string a="he";
string b="llo";
string s= sum(a,b);//join two string  s=hello
....

این جا هم مثل کلاس ها هر بار که تابع لا نوع جدید صدا زده میشه type ها جایگزین میشن و یک تابع جدید ساخته میشه .

فرق مهمی که توابع با کلاس ها دارن اینه که توابع رو کامپایلر بصورت خودکار نوع پارامتر T رو اگر امکانش باشه تشخیص میده یعنی نیازی نیست به شکل زیر بنویسیم :

sum<int>(2,5);//moadele sum(2,5)

در مورد این که دقیقا این جایگزینی به چه شکل کار می کنه فصل اول  کتاب modern effective c++ توضیحات کاملی داره .

چیزایی که من گفتم صرفا یک آشنایی اولیه بود برای کسب اطلاعات بیشتر میتونید از کتاب های C++ ای که هست استفاده کنید دانلود کتاب ++C

کتاب های پست 1و 2  لینک بالا تقریبا همشون یک فصل کامل درباره template دارن و

2 تا کتاب  c++ template و c++ template meta programming هم  کتاب های خیلی خوبی هستن و  فقط به مبحث template ها پرداختن  .

 

پاسخ داده شده مرداد 20, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد مرداد 22, 1393 بوسیله ی Ali Rahbar
...