PDA

View Full Version : مشکل در template ها



nasrin55
شنبه 13 تیر 1388, 09:24 صبح
برنامه ی زیر را در نظر بگیرید:


#include <conio.h>
#include <iostream>
using namespace std;
template<typename T, typename S, int a>
class A
{
public:
T f(typename S x)
{
cout<< x << endl;
return static_cast<T>(x);
}
};
void main()
{
A<int,double,4> a;
cout<< a.f(4.25);
_getch();
}



خروجی اون 4.25 و 4 است . چرا عدد 4 چاپ میشود؟
مگه خودمون نوغ X را از نوع s نگفتیم؟ پس باید همون 4 چاپ بشه؟

cloudy day
شنبه 13 تیر 1388, 09:52 صبح
میگم میخاین یه توضیح کلی راجب کل چیزایی که نوشتین بدین شاید ما هم فهمیدیم...

nasrin55
شنبه 13 تیر 1388, 10:06 صبح
میگم میخاین یه توضیح کلی راجب کل چیزایی که نوشتین بدین شاید ما هم فهمیدیم...


من کار خاصی نکردم .
اول یه کلاس به اسم A تعریف کردم بعد توی این کلاس یه تابع f تعریف و پیاده سازی شده. ok

تنها نکته ای که داره اینه که از template استفاده شده.
در خط چهارم اینکار را کردم.
حالا هر جایی که خواستیم از این نوع های تعریف شده در template استفاده شده. البته فکر میکنم که به جای typname در template میشه از کلمه ی class هم استفاده کرد (کاری که ما اغلب میکنیم) یا هر کلمه ی دیگه.
حالا سوال من اینه که چرا اینجوری return کردیم؟؟


return static_cast<T>(x);

tdkhakpur
شنبه 13 تیر 1388, 10:30 صبح
سلام
خوب شما کد زیر را باید از نوع اعشار بگیرید تا قسمت اعشار را نیز چاپ کند.


template<typename T, typename S, float a>

Saeed_m_Farid
شنبه 13 تیر 1388, 14:06 عصر
خروجی اون 4.25 و 4 است . چرا عدد 4 چاپ میشود؟
مگه خودمون نوغ X را از نوع s نگفتیم؟ پس باید همون 4 چاپ بشه؟
دوست عزیز :
دقت کنید که خروجی این تابع f از کلاس A شما از نوع T است، این ورودی است که از نوع S است! بنابراین شما باید یه تبدیل نوع از S به T داشته باشین : واسه همینه که static_cast استفاده میشه.
یعنی تابع شما اول ورودی x از نوع S رو چاپ میکنه و بعدش با static_cast اون رو تبدیل میکنه به نوع T و به عنوان خروجی بر میگردونه : پس اولین خروجی (یعنی4.25) تو بدنه تابع f چاپ میشه و مقدار دومی (یعنی 4) که چاپ میشه پارامتر خروجی تابع f هست که شما تو main چاپش کردین.
- درضمن تو ایجاد یک شی از کلاستون (A<int,double,4> a) مقداری که دارین به عنوان a میدین (یعنی 4) اصلاً استفاده نمیشه، یعنی حتی اگه اونو 1000000000 هم بدین تو خروجی تاثیری نداره.


حالا هر جایی که خواستیم از این نوع های تعریف شده در template استفاده شده. البته فکر میکنم که به جای typname در template میشه از کلمه ی class هم استفاده کرد (کاری که ما اغلب میکنیم) یا هر کلمه ی دیگه. ؟؟؟ یعنی چی هر کلمه دیگه ای؟ فقط از "نوع" ها میتونید استفاده کنید، مثل : استراکچر، کلاس، enum (مقادیر شمارشی) و ...
مثلاً میشه "چغندر!" استفاده کرد؟

موفق باشید.

cups_of_java
شنبه 13 تیر 1388, 16:11 عصر
به تابع f توجه کنید:

return static_cast<T>(x); از طریق این cast مقدار x داره به مقداری از نوع T تبدیل می شه و شما در دستور

A<int,double,4> a;نوع int رو به T نسبت دادید. پس در مقدار برگشتی تابع مقدار صحیح 4 قرار می گیره.
به این صورت اول 4.25 چاپ می شه (cout داخل f) و بعدش هم 4 چاپ می شه (cout داخل main) ! حالا مشکل شما چیه؟