ترکیب using و template در c++ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

ترکیب using و template در c++

+2 امتیاز

سلام.

آیا راهی هست که بشه یه همچین چیزی تعریف کرد:

using Matrix<T> = vector<vector<T>>;

بعد توی برنامه مثلا یه ماتریس از اعداد صحیح و یه دونه از اعشاری داشته باشم.

اگه جواب مثبته آیا راهی هست که بشه انواعی رو که T ساپورت میکنه رو محدود کرد.

مثلا یهو به جای T یه وکتور یا رشته نذارن؟

سوال شده تیر 6, 1394  بوسیله ی ehsan_faal (امتیاز 41)   1 4 7
من که سوالت رو نفهمیدم
اما با توجه به جواب پایین
میتونی از
typedef
#define
استفاده کنی
منظورم این بود که چطور نوع T  رو محدود کنم که هر چیزی نباشه مثلا فقط int  و  char  و double  باشه.

3 پاسخ

+1 امتیاز

جواب قسمت اول رو فهمیدم:

template<typename T>
using Matrix = vector<vector<T>>;

اما برای قسمت دوم سوال چطور؟

پاسخ داده شده تیر 6, 1394 بوسیله ی ehsan_faal (امتیاز 41)   1 4 7
0 امتیاز
دوست عزیز شما باید برای اینکار از overloading استفاده کنید و اصلا نیازی به template نیست
چون تایپ های شما محدوده template ذهنیتی که پشتش بوده برای تایپ های نامحدود هست

فقط توی تمپلیت میتونی تایپ پیش فرض بدی
پاسخ داده شده تیر 10, 1394 بوسیله ی Fire360Boy (امتیاز 2,524)   6 24 43
+1 امتیاز

برای سوال دوم  ۳ کار میتونید بکنید .

۱ـ  از vector ارث ببرید به این شکل :

template<class T>
class Matrix :public std::vector<std::vector<T>>
{
	static_assert(std::is_same<T,int>::value ||
		std::is_same<T, char>::value, "error");
};

Matrix<int> a;//ok
Matrix<std::string> b;//error

 

که خب ارث بردن از وکتور بخاطر مثلا virtual نبودن destructor کلاس مشکلاتی داره . در این مورد این لینک  اطلاعات نسبتا خوبی داره .

 

۲ـ راه حل بعد اینه که vector رو به عنوان عضو private کلاس بزارید و متد هایی که می خواهید رو پیاده سازی کنید و با همون assert هم type رو چک کنید .

 

 ۳ـ این کار را هم میشه انجام داد :

using MatrixInt=vector<vecetor<int>>;
using MatrixChar=vector<vector<char>>;

 

پاسخ داده شده تیر 19, 1394 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
...