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 ها پرداختن .