C++/תבניות

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי
< C++

תבניות הן תכונה ב++C המאפשרת לנו ליצור קוד דינאמי ובכך לחסוך בכתיבת אותו הקוד שוב ושוב.

הצורך בתבניות[עריכה]

על מנת להבהיר את הצורך בתבניות, נביא דוגמת קוד:

void swap(int &a, int &b)
{
  int temp = a;  
  a = b;
  b = temp;
}


קוד זה עושה פעולה פשוטה מאד: הוא מקבל שני משתנים מיוחסים ל-int ומחליף ביניהם.

אז מה הבעיה? בואו ננסה לכתוב את אותו הקוד עבור טיפוס char:

void swap(char &a, char &b)
{
  char temp = a;  
  a = b;
  b = temp;
}

נראה מעט מוכר, לא?

נסביר מעט: ההבדל בין שתי הדוגמאות הוא רק סוגי המשתנים. חוץ מהם, הקוד זהה לחלוטין.

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

תבניות פונקציות[עריכה]

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

template<typename T>
void swap(T &a, T &b)
{
  T temp = a;  
  a = b;
  b = temp;
}

ועכשיו נבין את הכתוב: בהתחלה, אנו מצהירים כי הפונקצייה שלנו היא תבנית (שורה 1) ומגדירים משתנה ששמו הוא T שישמש לנו כסוג הפונקצייה.

כעת, נוכל להשתמש ב-T כסוג משתנה לכל דבר ולהגדיר בעזרתו משתנים (כדוגמת המשתנה temp).

שימוש בפונקציה יראה כך:

swap<type>(a, b);

תבניות מחלקות[עריכה]

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

template<class T>
class A {
T x;
T y;
public:
A(T a,T b)
{x=a;y=b;}
T func();
};

template<class T>
T A::<T>func()
{/*....*/}


הפרק הקודם:
RTTI
תבניות הפרק הבא:
מרחבי שם