תבניות
 
נושא שיעור זה הוא תבניות (templates).
יעילות התבנית ומשמעותה תוסבר ע"י הדוגמא הבאה:
נניח שאתה רוצה להשתמש במערך בתוכנית שלך, אך אינך יודע באיזה גודל הוא יהיה.

int a[???];
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

אתה רוצה שתהיה לך את האפשרות להמשיך ולהרחיב אותו במשך הזמן.
במקרה זה אינך יכול פשוט להשתמש במערכים המובנים ב-++C, לכן האפשרות הטובה ביותר תהיה ליצור מחלקה משלך של מערכים. אם נניח שכל אלמנט במערך הוא int, ניתן לעשות זאת כך:

class Array {
 int *storage;
 int elementCount;
public:
 Array();
 ~Array();
 int &operator[](int s);
};
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

למחלקה משתנה מחלקה storage המצביע למקום לשימוש המערך, משתנה מחלקה elementCount העוקב אחר גודל המקום, ובנאי ומפרק המקצים ומשחררים את המקום.
לבסוף, הגדרנו אופרטור [], שכאשר מופעל על מספר כלשהו, ייתן את האלמנט שיושב במקום זה, ואם מופעל על מספר גדול מגודל המערך, אוטומטית יגדיל את המערך.
אך במחלקה זו יש בעיה: המחלקה מטפלת במערכים של int בלבד. אם נרצה מערך של float, יהיה עלינו לכתוב את הקוד הזה שוב עבור float. וכך גם נזדקק לעותק עבור long, char, double, וזאת עוד לפני שנחשוב על מערכים לאובייקטים של מחלקות שונות.
ובכן, תבניות פותרות את הבעיה הזאת, הן מאפשרות להגדיר מחלקה פעם אחת בלבד, אבל מאפשרות לה לעבוד עם סוגי טיפוסים שונים.
כדי להפוך את המחלקה לתבנית נצטרך לשנות את הקוד בצורה הבאה:

template<class T>
class Array {
 T *storage;
 int elementCount;
public:
 Array();
 ~Array();
 T &operator[](int s); };
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

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

template<class T, class G>
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט