שאלה לגבי C++

kanyewest1

New member
שאלה לגבי C++

שלום,
קיבלתי שאלה קשה ואשמח להסבר והכוונה.
השאלה :


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

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


תודה.
 

selalerer

New member
היות ומדובר על משהו שצריך לקרות בזמן קומפילצי

ה, אז מדובר ב-meta programming.

אני מניח שאפשר ליצור template למערך עם specialization עבור מצבים בהם ה-index הוא מחוץ לטווח.



template <int LEFT, int RIGHT>
struct IsLess
{
enum { value = (LEFT < RIGHT) };
};

template <bool IS_OUT_OF_RANGE>
struct OutOfRangeError;

template <>
struct OutOfRangeError<false>
{
};

template <typename T, int SIZE>
class Array
{
public:
template <int INDEX>
T& getItem()
{
OutOfRangeError< IsLess<INDEX, 0>::value > o1;
OutOfRangeError< ! IsLess<INDEX, SIZE>::value > o2;

return m_arr[ INDEX ];
}

private:
T m_arr[ SIZE ];
};


זאת דוגמא פשוטה יחסית עם שימוש ב-getItem ולא []operator שאני מניח שהתכוונו שתשתמש בו בשאלה.

שימוש ב-[]operator ידרוש ממך כמו שרמזו בשאלה ליצור type חדש עבור ה-index ואולי גם התמודדות עם מצב שבו נותנים לך משתנה ולא קבוע בזמן קומפילציה.
 
למעלה