עבור לתוכן

Template struct

Featured Replies

פורסם

איך אוכל להגדיר את struct מסוג template

תנו בבקשה דוגמה איך זה אמור להיראות בהגדרה וב-main

מה לא טוב בחלק הזה של הקוד

template <class T>
struct s{
T data;
};



int main()
{
s <WHAT IS THIS> myS;


return 0;
}

פורסם

איפה שרשמת "WHAT IS THIS", אתה צריך לכתוב את ה-type שאיתו אתה רוצה לממש את ה-struct.

פורסם
  • מחבר

לדוגמה

s <int> myS;

ככה?

פורסם

בדיוק.

פורסם
  • מחבר

ואם איני יודע מראש מאזה סוג יהיה ה-DATA?

אם אני אדע את זה רק אחרי ריצת תוכנית?

לדוגמה המשתמש אמןר לבחור מאיזה סוג DATA הוא יכניס?

פורסם

אתה לא יכול לעשות דבר כזה בעזרת templates. לא בצורה נורמלית, בכל אופן...

כשאתה מגדיר ב-main את myS מסוג s, הקומפיילר צריך לדעת כמה מקום להקצות לאיבר הזה בזיכרון. בשביל לדעת את זה, הוא חייב לדעת כמה מקום להקצות לכל member של ה-struct הזה, ולכן, הוא צריך לדעת, כבר בזמן קומפילציה, את ה-type של כל member.

בקיצור, הקומפיילר לא מקמפל קוד מטומפלט (עם templates) עד שמקום כלשהו אחר בקוד יצר instance של ה-struct/class המטומפלטים, וציין בעזרת איזה type לממש את ה-struct/class.

פורסם

אז אי אפשר לעשות את זה.

הקומפיילר חייב לדעת את הערך שאתה נותן לטמפלייט בזמן הקומפילציה.

בכל מקרה, אם אתה רוצה לאפשר למשתמש לבחור איזה טיפוס לתת לטמפלייט, אתה חייב להגביל את עצמך מראש לכמה טיפוסים, ואז לתת למשתמש לבחור ביניהם. ואז תוכל לעשות אחד משלושה דברים:

1. מראש ליצור את כל ה-instace-ים האפשריים, כלומר s<int> x; s<double> y וכן הלאה, וכל פעם לבחור את ה-instance הרצוי לפי רצון המשתמש.

2. לעשות s<void*> x, ואז לעשות את ההמרה בכל פעם שאתה רוצה לקרוא או לכתוב לטיפוס הזה. זו השיטה ה-C-ית להתמודד עם התמודדות עם טיפוסים בזמן ריצה.

3. להשתמש בירושה. הבעיה היא שתהיה חייב ליצור טיפוסים חדשים משלך שכולם ירשו מאותו אבא, ולא תוכל להשתמש בטיפוסים קיימים (כמו int,double).

פורסם
  • מחבר

אוקי תודה, אלך לנסות

כנראה אצתרך לעשות כפל קוד

פורסם

אם תפרט קצת יותר מה אתה רוצה לעשות, כנראה יהיה אפשר לעזור לך יותר טוב.

אם אתה רוצה להתייחס לאובייקטים שהגדרת בצורה דומה (למשל להחזיר רשימה של מצביעים אליהם) אתה יכול לעשות class אב רגיל (ואפילו ריק), שממנו יורש ה- class הטמפלייטי.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים