templates

eyal the one

New member
templates

נניח יש לי את הקוד הבא:
vector<int> vec1; vector<int> vec2; vec1.pushback(3); vec2.pushback(4);​
האם מנגנון ה templates יוצר לי שתי פונקציות pushback, אחת עבור כל אוביקט?? כלומר האם בזכרון זה רשום עכשיו פעמיים?
 

annefan

New member
לא

(וזה גם לא קשור ל-templates. אגב, יש להם שם בעברית? נמאס לי כבר להפוך כיוון כל פעם) באופן כללי, פונקציות מוגדרות כמספר המחלקות, לא האובייקטים. כיוון שכאן יש לך רק מחלקה אחת:
vector<int>​
יש רק פונקציה אחת.
 

eyal the one

New member
הי תודה

אני נמצא פה באיזה שהוא ויכוח עם מישהו שטוען שזה לא כך ב templates. יש לך אולי דרך להוכיח את זה (סליחה על החוצפה) אולי דרך בדיקת כתובת הפנייה לפונקציה? או יש לך אולי איזה לינק?
 

vinney

Well-known member
למה להתווכח?

הprecompiler פורש את התבניות עבור כל אחד מהטיפוסים שמוצבים כפרמטר. במקרה שלך יש שתי הגדרות:
vector<int> vector<int>​
ז"א - הוצב אך ורק int, מכאן התבנית תפרש רק פעם אחת ורק עבור int כטיפוס (ורק פונקציה pushback). זאת ההגדרה של התבנית, אין פה מקום לויכוח.
 

annefan

New member
מזמן כבר לא

פריסת templates היא חלק מהקומפילציה, לא חלק מה-pre-processor. אולי פעם זה היה ככה.
 

eyal the one

New member
בכל זאת

גם אני מסכים אתכם, יש איזה דרך שאני אוכל להוכיח את זה. זה ממש חשוב לי. הפניה לאתר, או כתובת של פונקציה או משהו.
 
לא לא - זה כל הכיף...../images/Emo13.gif

כל היופי הוא שיש לך בדיקה של הטיפוסים עם templates - מה שאין לך עם ה-preprocessor...
 

vinney

Well-known member
היה לי ויכוח על זה עם המרצה שלי

באוניברסיטה, היא אפילו הורידה לי 2 נקודות בדיוק על הטענה הזאת... כך שאני אתחבה מאחורי הקביעה המוסמכת שלה ואתעקש שזה הpreprocessor, למרות שגם אני הייתי בטוח שזה נעשה כחלק מהקומפילציה. לגבי בדיקת טיפוסים, אגב, אתה לא צודק. אין לך. מה שהpreprocessor עושה פה הוא פשוט מציב מחרוזות "int" במקום "T" וזהו... זה מספיק...
 

annefan

New member
תפטר את המרצה שלך

יכול להיות שהיא הכירה קומפיילר כזה. אתה גם יכול להוכיח את זה מאוד מאוד בקלות. קמפל תוכנית ככה:
g++ -E prog.cpp > prog.i​
פתח את prog.i ותראה את הקובץ אחרי פ"פ ולפני קומפילציה. (כנ"ל עם E/ ב-VC) לגבי מה שאתה אומר, אתה ממש טועה. המטרה של תבניות (נשבר לי!) היא לאפשר קוד גנרי מצד אחד, ולא לאבד type-safety. ולכן זה לא ממומש בפ"פ, וזה בטח לא סתם החלפה של T ב-int. לא אכפת לי לפרט, אבל כבר כתבו על זה חכמים ממני בספר:
C++ Templates: The Complete Guide​
 

vinney

Well-known member
אוף... אפשר לצטט אותך בערעור?

זה מה שאמרתי לה, וקיבלתי 98 במקום 100 בדיוק בגלל הויכוח הזה
נו שוין, אז אני אחזור לדעתי הלא מוסחת ע"י גורמי אקדמיה ואגיד שאני מסכים עם כל מה שאתה אומר
 

עידו123456

New member
צטט לה את Bruce Eckel

מהספר של Bruce Eckel: Thinking in C++ second Ed: שים לב בעיקר לפיסקה השלישית
The template solution Although an object-based hierarchy with multiple inheritance is conceptually straightforward, it turns out to be painful to use. In his original book[61] Stroustrup demonstrated what he considered a preferable alternative to the object-based hierarchy. Container classes were created as large preprocessor macros with arguments that could be substituted with your desired type. When you wanted to create a container to hold a particular type, you made a couple of macro calls. Unfortunately, this approach was confused by all the existing Smalltalk literature and programming experience, and it was a bit unwieldy. Basically, nobody got it. In the meantime, Stroustrup and the C++ team at Bell Labs had modified his original macro approach, simplifying it and moving it from the domain of the preprocessor into the compiler. This new code-substitution device is called a template[62], and it represents a completely different way to reuse code. Instead of reusing object code, as with inheritance and composition, a template reuses source code. The container no longer holds a generic base class called Object, but instead it holds an unspecified parameter. When you use a template, the parameter is substituted by the compiler, much like the old macro approach, but cleaner and easier to use. Now, instead of worrying about inheritance or composition when you want to use a container class, you take the template version of the container and stamp out a specific version for your particular problem, like this: The compiler does the work for you, and you end up with exactly the container you need to do your job, rather than an unwieldy inheritance hierarchy. In C++, the template implements the concept of a parameterized type. Another benefit of the template approach is that the novice programmer who may be unfamiliar or uncomfortable with inheritance can still use canned container classes right away (as we’ve been doing with vector throughout the book).​
 
והנה ה-100 שלך ויני...../images/Emo26.gif

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

vinney

Well-known member
סדנא ב++C

איזה עוד קורס ייחס חשיבות לכזה דבר
ותגיד לי, איזה תלמיד בטכניון יכול תוך כדי לימודים לצבור 4 שנות וותק בתפקיד מהנדס תוכנה ?
 
יש לי חדשות בשבילך...../images/Emo98.gif../images/Emo26.gif

בטכניון זו לא בעיה
כי תואר של 4 שנים לוקח לעשות 7... אז מה הבעיה בלעבוד ב-4 מתוכן...
[ואני מדבר מנסיון לצערי...]
 

vinney

Well-known member
לא

אין שנים באו"פ, יש קורסים ונקודות. התואר באו"פ זה 108 נקודות (BA), שזה שקול לתואר תלת שנתי בטכניון. אבל אני לא מוגבל בזמן (לא ברמה מעשית לפחות), ולא בסדר הקורסים שאני לוקח, רק בתוכנית הלימודים (שגם אותה אני מרכיב, לפי תנאים של מל"ג וכפוף לאישור של האוניברסיטה).
 
ככה זה בדיוק בטכניון...../images/Emo63.gif../images/Emo26.gif

אין בעיה לעשות תואר 4 שנתי - גם ב-6 (ואם הציונים סבירים - יאשרו לך גם ביותר מזה). ואת אף-אחד גם לא מעניין איזה קורסים אתה לוקח ובאיזה סדר (אלא אם יש קדם לקורס). מתי שבא לך, אתה מגיע למזכירות - אומר להם: "סליחה? אני רוצה תואר בבקשה...", בודקים אם הקורסים שעשית ממלאים את הדרישות - וזהו... אבל אם ה"סוד" שלך להצליח לעבוד במקביל לתואר - הוא פשוט לפרוש אותו על שנה-שנתיים יותר - אז זה מאוד דומה למה שרוב הסטודנטים בטכניון עושים...
רוב מי שאני מכיר מתחילים לעבוד בסביבות שנה שנייה, ואצל רובם התואר מתמשך סמסטר או שניים יותר... ככה - שבדיוק כמו שאתה אומר - הם יוצאים עם 3 שנים פלוס נסיון בעבודה... + תואר מהנדס (שבפני עצמו אומר שהם עשו 2-3 פרויקטים במסגרת הלימודים והתמחו בלפחות 2 תחומים שונים במסגרת התואר). בקיצור - יהיו לך קשה מאוד למצוא חסרונות בלימודי הטכניון...
ולי?... לי לא יהיה קשה... כי אני אפילו לא מנסה לחפש חסרונות באו"פ... בעוונותיי יצא לי לעשות 3-4 קורסים באו"פ, ואין לי שמץ של טענה... (חוץ מקצת גמישות בהגשת ממ"נים/ממ"חים דחילק!!!
)
 

vinney

Well-known member
אני לא מחפש חסרונות ../images/Emo13.gif

זה עניין של טעם אני מעדיף שיתנו לי ספרים, אני כבר אסתדר לבד. ממה ששמעתי מחברים שלי שלומדים בטכניון, הדרישות שם הרבה יותר נוקשות ממה שאתה מתאר, אבל אולי כי הם לומדים במגמות אחרות (פיזיקאים ומהנדסי חשמל). בכל מקרה, השורה התחתונה היא שכל בוגרי הטכניון שאני נתקלתי בהם (לא עשרות אומנם, אבל כל אחד מהם) לא הצליחו לבצע את המשימות שלהם בצורה ראויה בעבודה, זאת בניגוד לכמה מהנדסים שאני מכיר שבכלל אין להם תואר רשמי, בוגרי אוניברסיטת בן גוריון (שלדעתי הכי טובה בארץ לתואר ראשון במדמ"ח/מתמטיקה) או או"פ (השניה בסדר), או אפילו בר אילן (שלדעתי, באופן כללי, זה מפעל לייצור נייר טואלט, לא אוניברסיטה). אומנם זו דיעה סטיגמתית סובייקטיבית, אבל זה מה יש
 
למעלה