בעיה בלינקר של VS C++ 6.0 - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

בעיה בלינקר של VS C++ 6.0


Ghosthunter

Recommended Posts

יש שתי בעיות בהצעה הנ"ל:

1) לא כולם עובדים עם exceptions.

2) הבעיה תתגלה רק ב-runtime במקום בזמן קומפילציה.

יש פתרונות טובים יותר והם מתבססים על template specialization:

פתרון אחד הוא לתת פונקציה כללית אשר מכילה שגיאה והתמחות ספציפית ל-string אשר מכילה קוד נכון.

מי שינסה להשתמש בפונקציה על משהו שהוא לא string יקבל את הגרסה הכללית אשר אינה מתקמפלת.

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

וריאציות נוספות מתבססות על ירושה, על partial specialization, או על בלאגן אחר.

ניתן גם להשתמש ב-static_assert או static_check וב-traits.

העקרון החשוב: עדיפה שגיאה בזמן קומפילציה משגיאה בזמן ריצה.

קישור לתוכן
שתף באתרים אחרים

לכתוב קוד אסור לדוגמא:

template < typename T >
inline bool fun( const T& val )
{
struct {};
}

template <>
inline bool fun<string> ( const string& val )
{
return val.size() > 0;
}

יש עוד הרבה גרסאות. אני ממליץ לבדוק את compile time assert ב-BOOST .

הנה גרסה C-ית מ-Loki:

#define STATIC_CHECK(expr, msg) \
typedef char ERROR_##msg[1][(expr)]

קישור לתוכן
שתף באתרים אחרים

Boost היא ספרייה לא סטנדרטית, אבל ידועה מאוד ומשמשת כ"השלמה" ל-STL ולספריות אחרות.

היא נכתבת ומתוחזקת ע"י אנשים רציניים מאוד, והמטרה הסופית היא להכניס חלקים ממנה לסטנדרט של C++. הספריה כמובן חינמית לחלוטין.

http://www.boost.org/

יש כמובן גרסאות C++ טובות יותר ל-compile time assert אשר עושות שימוש ב-templates. ספרית BOOST כוללת אוסף שלם של compile time predicates.

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...