-
تعداد ارسال ها
4 -
تاریخ عضویت
-
آخرین بازدید
پست ها ارسال شده توسط CISCO
-
-
در 7 ساعت قبل، قاسم رمضانی منش گفته است :علیکمالسلام.
قبل از اینکه به پاسخ مستقیم سؤال بپردازیم ، بیاید درک کنیم چه شد که
template
ها نیاز برنامهنویس شد.این تابع را در نظر بگیر :
int Sum (const int& first, const int& second){
return first+second;
}
این تابع دو عدد از نوع
int
دریافت و حاصل جمعشون را بر میگردونه.خب ! حالا چه میشه اگه شما بخواید به جای
int
نوعdouble
ارسال کنید ؟ و برنامهٔ شما با انواع مختلفی داده نیاز داشته باشه که با این تابع کار کنه. شاید بگید خب یک تابع دیگه با پارامتر و نوع بازگشتیdouble
مینویسم.با این روش چه مشکلاتی پیش میآید :
- کد تکراری.
- بالا رفتن درصد خطای کد.
- افزایش بیدلیل حجم کد.
- سخت شدن مدیریت کد.
- مشکل در آپدیت کردن سورس کد.
- و ...
زبان سیپلاسپلاس برای رفع این مشکلما
template
ها را معرفی کرده است.template
ها میتوانند هر نوع دادهای را قبول کنن. تابع زیر ، تابعtemplate
بازنویسی شدهٔ تابعSum
است که در مثال بالا نوشتیم :template <typename newType> newType Sum (const newType& first, const newType& second){
return first + second;
}
خییییلی بزرگ شد ن ؟. خب میتونیم کوتاهش کنیم :
template <typename newType>
newType
Sum (const newType& first, const newType& second){
return first + second;
}
- نکته : میدانیم که کامپایلر فاصلههارا نادیده میگیره.
خب ! اوّل برای تبدیل تابع ، به یک تابع
template
باید از کلمهٔ کلیدیtemplate
استفاده کنیم. و بعد با استفاده از< >
اسم نوع دادههای جدیدمان را بنویسیم.-
نکته : ما هیچ نوع دادهٔ جدیدی درواقع تعریف نمیکنیم. این تعریف فقط معرفی یک اسم به عنوان نوع دادهای هست که میتواند به هر چیزی اعم از
int,double ,...
تبدیل بشود.
و داخل
< >
ما از کلمهٔکلیدیtypename
برای تعریف اسم داده استفاده کردیم. و همچنین میتوانیم کلمهٔکلیدیclass
نیز استفاده کنیم که هردو برابر یک دیگر هستن. امّا زمانی شما داریدtemplate
ی ازtemplate
درست میکنید. مثلاً این نمونه :template < template <typename> class MyTmpClass, typename newType>
اینجا دیگه نمیتوانید بین کلمهکلیدی
typename
وclass
تفاوت قائع نشید. چرا که نیازه صراحتاً مشخص. امّا در استاندارد ۱۷ این مشکل وجود ندارد ِ؛ ولی بهتر است که این تفاوت را اعمال کنیم.حال به راحتی میتوانیم تابع را فراخوانی کنیم. به تکه کدزیر توجه کنید
Sum (12 ,32);
Sum (1'000'000'000'000,3212'333'233);
Sum (std::string("ghasem") , std::string("ramezani"));
Sum (12, 32.0);
سه خط اوّل کد بدون مشکل کامپایل میشوند. الا خط آخری. چرا که ما یک پارامتر با نوع
int
و یک پارامتر با نوعdouble
ارسال کردیم.برای حل این مشکل بیاید ببینیم که
template
ها به چه صورت کار میکنند. فرض کنید این تابع را فراخوانی کردیم :Sum ( int , int );
وقتی کامپایلر به این تابع بر میخورد. تابع
template
مارا به اینصورت برای ما بازنویسی میکند :int
Sum (const int& first, const int& second){
return first + second;
}
خب ! و وقتیما سعی میکنیم این تابع را فراخوانی کنیم :
Sum ( int , double );
برنامه کامپایل نمیشود و خطای زیر را ساطع میکنن. چرا که یک پارامتر
Int
و دیگریdouble
هست../main.cpp:5: candidate template ignored: deduced conflicting types for parameter 'newType' ('int' vs. 'double')
آیا این شکل استفاده از توابع براتون آشنا نیست ؟ یه کم فک کنید :
-
std::vector
-
std::array
-
std::list
تمام این کلاسها ،
template class
هستند. و هر نوعی میتوانند قبول کنند :#include <vector>
#include <string>
class myClass{
public:
myClass(){}
};
int main (void){
std::vector <int> myIntger {1,2,3,4};
std::vector <std::string> myString {"ghasem" , "ramezani"};
std::vector <myClass> myClassVector;
return 0;
}
این توضیح خیلی خلاصه از
template
ها و روش استفاده از آنها بود و به همین دو خط محدود نمیشوند.و اینکه گفتید "به نظر پیچیده میباشد" . پیچیدگی در عین سادگی یکی از قابلیتهای فوقالعادهٔ زبان سیپلاسپلاسه. اصلاً کد باید وحشتناک باشه.
بسیار ممنون از پاسخ مفید و ععال شما !
- 1
-
با سلام , امروز در حال گشتن توی یک سایت به عبارت template برخورد کردم. بعد از کمی گشتن در اینترنت تا حدودی فهمیدم که این عبارت برای ++C میباشد ولی از آنجا که به نظر پیچیده میباشد از دوستان خواهشمندم توضیحی درباره این موضوع با یک مثال بدهند تا هم من و هم بقیه از این روش اطلاع داشته باشیم.
-
سلام, یک سوال که ذهن منو چند وقته به خودش درگیر کرده این هست که:
الان اگر شما برنامه نویسی رو کامل و بدون مشکل بلد باشی اولین حرکتی که میکنید برای پول در آوردن چیه؟
انتخاب یک واسط گرافیکی خوب برای ++C
در سوالات عامیانه در رابطه با ++C مدرن
ارسال شده در
یه سوال داشتم که خیلی وقت هست درگیرش هستم.
من خودم به صورت عادی از win32 در ++C استفاده میکنم و برای ساختن حتی یه button کلی زور میزنم و کد مینویسم برای رویداد ها و لوکیشن و ...
حالا بماند که برای تنظیم یک رنگ برای یک button یا text چقدرر دردسر دارم.
من قبلا با زبان #C کار میکردم و با رابط گرافیکی و طراحی رابط گرافیکی اون به خوبی آشنا هستم . البته میدونم که امنیت برنامه های .net کلا ضعیف هست اما از لحاظ گرافیکی به راحتی میشه هر نوعی که بخوایم در کمترین زمان طراحی کنیم. البته اگر بخوایم باز کد ها و دستورات رو با .net بنویسیم چیز جالبی نمیشه.
البته نا گفته نماند که به Qt ام برای طراحی فکر کردم اما چند تا مشکل دارد . اولی اینکه حجم برنامه رو به شدت میبره بالا . دوم تعداد فایل های برنامه رو میبره بالا . سوم من در کل IDE برنامه نویسیم در Visual studio هست و به اون بیشتر عادت دارم چون خیلی ساده تر هست نسبت به Qt و اگر بخوام پلاگین های qt رو بریزم توی vs باز هم باید به صورت کد و لوکیشن و ... انجام بدم که تقریبا مثل win32 میشه فکر کنم.
من خودم شخصا برای این مشکل به این فکر افتادم که رابط گرافیکی رو با c# بنویسم و همه کد ها رو توی یه قالب dll که به زبان c++ نوشته شده از #C فراخانی کنم.
نظر شما چیه؟ راه حل بهتری سراغ دارید؟