PDA

View Full Version : سوال: به نظر من template چیز به درد نخوری است!!!



motherboard
پنج شنبه 30 مرداد 1393, 19:36 عصر
سلام.من دارم tamplate
رو یاد می گیرم.از نظر من که به درد نخورترین ویژگی در c++ است.مثلا کد زیر رو در نظر بگیرید.که چی اخه:

#include <iostream>
using namespace std;

template <class T>
T sum (T a, T b)
{
T result;
result = a + b;
return result;
}

int main () {
int i=5, j=6, k;
double f=2.0, g=0.5, h;
k=sum<int>(i,j);
h=sum<double>(f,g);
cout << k << '\n';
cout << h << '\n';
return 0;
}

motherboard
پنج شنبه 30 مرداد 1393, 19:59 عصر
یکی باید به من بگه این tamplate به چه دردی می خوره!! والا همین طوری اسپم می دهم.!!

alireza es
پنج شنبه 30 مرداد 1393, 20:23 عصر
template نبود vector , qlist و هزار تا کوفت و زهرمار دیگه نبود -ـ-
یعنی چی به درد نمیخوره؟زمانی که بخوای یه چیزی درست کنی(مثل یه تابع)
که نوع ورودیش معلوم نباشه باید از template استفاده کنی.

motherboard
پنج شنبه 30 مرداد 1393, 20:29 عصر
template نبود vector , qlist و هزار تا کوفت و زهرمار دیگه نبود -ـ-
یعنی چی به درد نمیخوره؟زمانی که بخوای یه چیزی درست کنی(مثل یه تابع)
که نوع ورودیش معلوم نباشه باید از template استفاده کنی.

اخه می دونی موضوع چیه؟الان تو همین کد بالایی من هی نگاه می کنم میبینم نیاز نداره که از tamplate استفاده بشه.مثلا تو کد بالایی چه کاریه بیایم template درست کنیم.الان به نظر شما در کد بالا template نیاز است؟با سپاس

alireza es
پنج شنبه 30 مرداد 1393, 20:34 عصر
اخه می دونی موضوع چیه؟الان تو همین کد بالایی من هی نگاه می کنم میبینم نیاز نداره که از tamplate استفاده بشه.مثلا تو کد بالایی چه کاریه بیایم template درست کنیم.الان به نظر شما در کد بالا template نیاز است؟با سپاس

کد بالا فکر کنم برای آموزشه
و شایدم بدون template بشه پیادی سازیش کرد
ولی برخی چیزارو نمیشه بدون استفاده از template پیاده سازی کرد
کلا template از ويژگی های ضروریه c++ هستش
توی فریم ورک کیوت به وفور ازش استفاده شده

omid_kma
پنج شنبه 30 مرداد 1393, 20:55 عصر
برای صدا زدن تابع template نیازی به ذکر کردن نوع نیست

h=sum(f,g);

هم درست کار می کنه و T خودکار تشخیص داده میشه .
بعد مثالتون اصلا کار بیخودیم هست وقتی عملگر + وجود داره کسی تابع براش نمینویسه .
در مورد کاربرد template تقریبا تمام توابع و کلاس های استاندارد ++C اثری از template داخلشون وجود داره مثلا تعریف تابع sort رو در نظر بگیر :

template<class _RanIt,
class _Pr> inline
void sort(_RanIt _First, _RanIt _Last, _Pr _Pred)


کاربرد template اینه که یک تابع یا یک کلاس رو فقط یکبار مینویسید و برای همه ی انواع داده ای استفاده می کنید .
کاری که با template انجام میدن رو داخل C با void* انجام میدن یعنی یک متغیر میفرستن به تابع یا کلاس بعد داخل تابع cast می کنن که مشکلی که داره اینه که typesafe نیست و باعث باگ های زمان اجرا میشه. دلیل بوجود امدن template هم همینه .

motherboard
پنج شنبه 30 مرداد 1393, 21:00 عصر
بعد این که برای صدا زدن تابع template نیازی به ذکر کردن نوع نیست
h=sum(f,g);
درست زدی تو خال.به جان خودم دقیقا سر این قضیه این قدر به tamplate بدبین شدم!!!! ولی الان دو هزاریم افتاد.

[younes]
پنج شنبه 30 مرداد 1393, 21:30 عصر
مبحث template یه مورد بسیار کاربردی هست و در جاوا که من باهاش کار میکنم یه راهکار مثل این وجود داره شاید بشه این طور گفت کلا در زبان هایی که خیلی به تعییین نوع متغییر ها پیش از کامپایل حساس هستند وجود چیزی مثل template حیاتی هست مثلا فرض کنید شما در جاوا یه تابع دارید که مقداری با نوع نا مشخض بر میگردونه حالا شما این تابع رو چه طور تعریف خواهید کرد؟

a.r.khoshghalb
پنج شنبه 30 مرداد 1393, 22:29 عصر
تا حالا شده از تابع سورت سی پلاس پلاس استفاده کنی؟
برات جالب نیست که چه استرینگ بهش بدی، چه اینتیجر چه دابل چه ... سورت می کنه؟
یا تا حالا شده از ست یا وکتور یا کیو یا مپ یا ... استفاده کنی؟
همه اینا کاربرد های خیلی خوبی از تمپلیت اند!

dasssnj
جمعه 31 مرداد 1393, 06:23 صبح
;2086778']مبحث template یه مورد بسیار کاربردی هست و در جاوا که من باهاش کار میکنم یه راهکار مثل این وجود داره شاید بشه این طور گفت کلا در زبان هایی که خیلی به تعییین نوع متغییر ها پیش از کامپایل حساس هستند وجود چیزی مثل template حیاتی هست مثلا فرض کنید شما در جاوا یه تابع دارید که مقداری با نوع نا مشخص بر میگردونه حالا شما این تابع رو چه طور تعریف خواهید کرد؟

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

ciavosh
جمعه 31 مرداد 1393, 08:57 صبح
برای صدا زدن تابع template نیازی به ذکر کردن نوع نیست

h=sum(f,g);

هم درست کار می کنه و T خودکار تشخیص داده میشه .


چون نوع مقدار بازگشتی مشخص نیست نباید نوع ذکر بشه؟

omid_kma
دوشنبه 03 شهریور 1393, 14:08 عصر
چون نوع مقدار بازگشتی مشخص نیست نباید نوع ذکر بشه؟
چرا مشخص نیست ؟

template <class T>
T sum (T a, T b)
{

مقدار بازگشتی نوعش با a و b یکیه هر سه T
T هم بر اساس نوع ورودی مشخص میشه

ciavosh
دوشنبه 03 شهریور 1393, 14:54 عصر
چرا مشخص نیست ؟

template <class T>
T sum (T a, T b)
{

مقدار بازگشتی نوعش با a و b یکیه هر سه T
T هم بر اساس نوع ورودی مشخص میشه

یعنی اتوماتیک بر اسا نوع آرگومان انتخاب میشه؟

omid_kma
دوشنبه 03 شهریور 1393, 15:01 عصر
یعنی اتوماتیک بر اسا نوع آرگومان انتخاب میشه؟
آره
از C++‎‎‎14 به بعد حتی میشه نوع بازگشتی تابع رو مثل متغیر auto گذاشت .
http://coliru.stacked-crooked.com/a/0f43fd6c5ec5e423