PDA

View Full Version : template چیست ؟ کاربردش چیه ؟



Azar.099
یک شنبه 03 فروردین 1393, 00:58 صبح
سلام دوستان
میخواستم درباره template برام توضیح بدید

rahnema1
یک شنبه 03 فروردین 1393, 09:03 صبح
سلام
فرض کنید شما یک تابع درست کرده باشید که پارامتر ورودی آن را مثلا از نوع char تعریف کرده باشید
حالا وقتی می خواهید از این تابع استفاده کنید ، برنامه از شما انتظار این را داره که یک مقدار char را وارد کنید و مثلا اگه یک int وارد کنید جواب درست نده
template برای اینه که شما یک الگو برای تابع مورد نظر تعریف کنید که اون تابع با توجه به آرگومان وروی که به اون معرفی می کنید خودش را با اون تطبیق بده
یعنی مثلا به جای اینکه برای هر ورودی یک تابع جداگانه بنویسید کافیه یک الگو بنویسید تا کامپایلر خودش با توجه به ورودی، تابع های مورد نظر را به صورت اتوماتیک در پشت صحنه برای شما تولید کنه
علاوه بر تابع ها همچنین در خصوص کلاسها هم template میشه درست کرد
به عنوان یک مثال برای الگوی تابع در نظر بگیرید می خواهیم یک تابع تعریف کنیم که دو تا مقدار را بگیره و اونی که بزرگتره را چاپ کنه
اگر دو ورودی ما double باشه باید یک تابع برای double و اگه هر دو int باشه یکی هم واسه int بنویسیم

#include <iostream>
using namespace std;
void maximum(int x, int y){
if (x>y)
cout<<"int:"<< x <<endl;
else
cout<<"int:"<< y <<endl;
}

void maximum(double x, double y){
if (x>y)
cout<<"double:"<< x <<endl;
else
cout<<"double:"<< y <<endl;
}
int main()
{
maximum(10,12);
maximum(10.0,12.0);
}

به جای این کار کافیه یک template بنویسیم که برای انواع داده مختلف کارآیی داشته باشه

#include <iostream>
using namespace std;
template <typename mokhtalef>
void maximum(mokhtalef x, mokhtalef y){
if (x>y)
cout<<"mokhtalef:"<< x <<endl;
else
cout<<"mokhtalef:"<< y <<endl;
}

int main()
{
maximum(10,12);
maximum(10.0,12.0);
maximum(10L,12L);
maximum((char)10,(char)12);
}

اگه بخواهیم مثلا از دو ورودی یکی از یک نوع و دیگری از نوع دیگه باشه هم template به این صورت میشه

#include <iostream>
using namespace std;
template <typename mokhtalef1,typename mokhtalef2>
void maximum(mokhtalef1 x, mokhtalef2 y){
if (x>y)
cout<<"mokhtalef1:"<< x <<endl;
else
cout<<"mokhtalef2:"<< y <<endl;
}
int main()
{
maximum(10,12);
maximum(10.0,12.0);
maximum(10.,12L);
maximum((char)10,(double)12);
}

توضیح: ابتدا کلمه template میاد بعدش بین <> پارامترهای template قرار می گیرند. در این مورد که ما استفاده کردیم پارامترهای ورودی عبارت بودند از «نوع» که حتما باید از کلمه typename یا به جای اون کلمه class استفاده کنیم. بعد از پارامترها هم تعریف تابع اومده
چند نکته: غیر از «نوع» میشه از پارامترهای غیر نوع استفاده کرد و همچنین یک template هم میتونه به عنوان پارامتر یک template دیگه استفاده بشه
شاید به عنوان مدخل به بحث مفید باشه توضیحات بیشتر را می تونید در کتابهای آموزشی و منابع مختلف که در اینترنت موجوده پیدا کنید

anotheruser
یک شنبه 03 فروردین 1393, 09:25 صبح
مچکر از اینکه وقت میزارین واسه یه مبتدی اینقدر تایپ می کنین و توضیح میدین :-)

anotheruser
یک شنبه 03 فروردین 1393, 09:26 صبح
سلام دوستان
میخواستم درباره template برام توضیح بدید

سلام ، سرچ سرچ سرچ بفرمایین

anotheruser
یک شنبه 03 فروردین 1393, 10:23 صبح
پیش خودمون بمونه راستش رو بخواهید من هم خودم یه مبتدی هستم

اینجوری که همه فهمیدن که آقای متواضع !

Azar.099
یک شنبه 03 فروردین 1393, 17:33 عصر
ممنونم از توضیحاتتون
یعنی من اگر ورودی یک تابع را بخوام sort کنم و ندونم که ورودی چی هست... چجوری میشه از این استفاده کنم وقتی برای sort رشته ها باید از strcmp استفاده کنم و برای اعداد باید جور دیگه ای بنویسم ؟
میشه در مورد کلاس های template هم یک توضیح مختصر و مفید مثل همین که زحمت کشیدید بنویسید؟

rahnema1
یک شنبه 03 فروردین 1393, 19:45 عصر
واسه کلاس هم به همون ترتیب حالا یه مثال شبیه همون مثال بالا این جوری

#include <iostream>
using namespace std;
template <typename mokhtalef1,typename mokhtalef2>
class my_class
{
mokhtalef1 x;
mokhtalef2 y;
public:
my_class(mokhtalef1 a, mokhtalef2 b)
{
x=a;
y=b;
}
void maximum()
{
if (x>y)
cout<<"mokhtalef1:" << x<<endl;
else
cout<<"mokhtalef2:"<< y <<endl;
}
};

int main()
{

my_class<int,int> a1(10,12);
a1.maximum();
my_class<double,double> a2(10.0,12.0);
a2.maximum();
my_class<double,long> a3(10.,12L);
a3.maximum();
my_class<char,char> a4((char)10,(double)12);
a4.maximum();
}

برای sort هم میتونید هیدر alogorithm را include کنید و از تابع sort استفاده کنید. که روی انواع داده می تونه عمل کنه . به طور پیش فرض از عملگر > جهت مقایسه استفاده میشه در صورت ارائه یک نوع جدید یک آرگومان به نام predicate وجود داره که یک تابع هست خودتون میتونید اون را تعریف کنید که به جای > استفاده بشه
http://www.cplusplus.com/reference/algorithm/sort

Azar.099
یک شنبه 03 فروردین 1393, 20:52 عصر
اگر نخواهیم از این کتابخانه استفاده کنیم template به دردی نمیخوره در اینکار ؟؟
اخر باید برای هر نوعی یک sort بنویسم

rahnema1
یک شنبه 03 فروردین 1393, 22:42 عصر
algorithm هم جزو standard template library یا STL هست که کلش بر اساس template هست . عملگر > برای بسیاری از انواع تعریف شده که چه کار بکنه دقیقا بگید چه موردیه که لازم باشه خودتون تعریف کنید؟

Azar.099
دوشنبه 04 فروردین 1393, 01:03 صبح
algorithm هم جزو standard template library یا STL هست که کلش بر اساس template هست . عملگر > برای بسیاری از انواع تعریف شده که چه کار بکنه دقیقا بگید چه موردیه که لازم باشه خودتون تعریف کنید؟

نه منظورم اینه که نمیخوام از algorithm استفاده کنم
من مثلا یه برنامه ای دارم که نمیدونم کاربر چه نوع داده ای میخواد به برنامه بده یعنی ورودی من یه جورایی void* هستش
بعد باید یک عملیات هایی اعم ازsort & ... انجام بده
من هم نمیخوام از algorithm استفاده بکنم
در این صورت برای sort کردن داده هام باید چکار کنم ؟؟؟
باید برای هر نوعی یک تابع بنویسم ؟

rahnema1
دوشنبه 04 فروردین 1393, 09:34 صبح
اگه می خواهید مثلا از qsort مربوط به stdlib استفاده کنید که آدرس یک تابع را می گیره می تونید به این صورت عمل کنید

#include <stdlib.h>
#include <string>
#include <iostream>
using namespace std;
template <typename T>
int compare (const void * a, const void * b)
{
T x=*(T*)a,y=*(T*)b;
if(x<y) return -1;
if(x>y) return 1;
if(x==y) return 0;
}
int main ()
{
{
string values[6]={"John","Jane","Mary","Rogery", "Dave", "Paul" };
qsort (values, 6, sizeof values[0], compare<string>);
for (int n=0; n<6; n++) cout<<values[n]<<endl;
}
{
int values[] = { 40, 10, 100, 90, 20, 25 };
qsort (values, 6, sizeof values[0], compare<int>);
for (int n=0; n<6; n++) cout<<values[n]<<endl;
}
return 0;
}

البته به علت اینکه سایز اعضای آرایه را می خواهد باید دقت کنید مقدار درست بدهید