שאלות ב-C++

שאלות ב-C++

אני מגדיר פונקציית TEMPLATE כזאת:
template<class T> T& Max(T& a, T& b) { cout << typeid(a).name(); if (a > b) return a; return b; }​
כאשר אני שולח לפונקציה מה-MAIN STR או INT הכל עובד בסדר אבל כשאני שולח * char נראה כאילו הוא משווה בן המצביעים ולא בין המחרוזות - כמו כן ניסיתי לשלוח את המשתנים בצורה הבא:
cout<<Max(*ch1,*ch2)<<endl;​
אבל אז הוא משווה בין התו הראשון בכל מחרוזת... האם יש דרך לפתור את זה - הוא שפונקציה מסוג זה לא יכולה לקבל מצביעים? תודה מראש על העזרה...
 

gmorphus

New member
זה מה שהוא יודע לעשות.

האופרטור ">" כשאתה מפעיל אותו על מצביעים משווה בין מצביעים. אין מה לעשות... אבל אתה יכול להגדיר Operator Overloading עבור char* (לא שאני חושב שזה חכם אבל שיהיה...). אפשרות נוספת ועדיפה היא להשתמש בstring של STL
 
זאת אומרת

שלא ניתן לממש את זה באופן פשוט (ע"מ למשל את האופרטור ">" אני צריך להגדיר CLASS וכאלה...) לא יעזור לי להשתמש ב-string של STL כי נשאלתי לגבי * char והייתי צריך עזרה בלהסיק שלא עובד...
 

zagzagzag

New member
אי אפשר להעמיס אופרטורים ל-*char

או לכל primitive type אחר. אני חושב שאפילו יש על זה שאלה ב-C++ FAQ
 

DadleFish

New member
אומרים לך שאי אפשר לעשות כזו.

אתה לא יכול לשנות את ההתנהגות של < עבור טיפוסים primitive כמו מצביעים או int או bool. מה שכן, אתה יכול לעשות template function specialization, כלומר לספק מימוש ספציפי ל-* char. הנה איך:
// playground.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "string.h" #include <iostream> using namespace std; template<class T> T& Max(T& a, T& b) { if (a > b) return a; return b; } const char *Max(const char *a, const char *b) { if (strcmp(a, b) > 0) return a; return b; } int main(int argc, char* argv[]) { cout << Max(5,6); cout << Max("Hello", "World"); return 0; }​
 
למעלה