الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

التحويل من نوع لأخر

مغلقمُجاب
بدأه C++er في 25 أغسطس 2011 · 1 رد · 514 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

فلنفترض وجود الفئه التاليه:

struct int64
{
	long long value;

	int64() : value(0) {}
	int64(signed char i8) : value(i8) {}
	int64(unsigned char u8) : value(u8) {}
	int64(short i16) : value(i16) {}
	int64(unsigned short u16) : value(u16) {}
	int64(int i32) : value(i32) {}
	int64(unsigned u32) : value(u32) {}
	int64(long long i64) : value(i64) {}
	int64(unsigned long long u64) : value(u64) {}
	int64(const int64& i64) : value(i64.value) {}

	int64& operator+=(const int64& rhs) { return value += rhs.value, *this; }
	int64& operator-=(const int64& rhs) { return value -= rhs.value, *this; }

	friend int64 operator+(const int64& lhs, const int64& rhs) { return int64(lhs) += rhs; }
	friend int64 operator-(const int64& lhs, const int64& rhs) { return int64(lhs) -= rhs; }
};

الفئه int64 ستعمل دون مشاكل و الكود التالي سبعمل دون مشاكل:

int64 q = 500;

int64 m = q + 1024;

إذا اردنا تحويل النوع int64 إلى أى من الأنواع الأساسيه سنحتاج لإضافة الكود التالي:

operator  char() const { return (char)value;  }
operator short() const { return (short)value; }
operator int() const { return (int)value; }
operator long long() const { return value; }

و لكن عند الترجمه ستظهر لنا خطأ فى السطر الثاني من كود الإختبار و هو انه للرقم 1024 توجد 5 تحويلات 4 منهم خاصه بكل معامل قمنا بإضافته و الأخير خاص بالـ conversion operator بالفئه int64.

للتحايل على هذه المشكله، قمت بحذف كود التحويل و إستخدام الـ template عوضا عنه:

template <typename n>
operator n() const { return (n)value; }

هذا الكود يعمل بشكل ممتاز و دون مشاكل مع مترجم VC++ و مترجم GCC و لكن مترجم Intel لازال يظهر نفس المشكله، فهل توجد لديك وسيله اخرى بخلاف المذكورين؟

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 25 أغسطس 2011 في 00:41

مدونتي: C++ Tips and Tricks

#2 أفضل إجابة

تم حل المشكله و ذلك بإضافة template operator للأنواع الإفتراضيه التى يتم إستخدامها داخل الفئه فى حالتنا هذه operator+ و operator- بالإضافة للـ conversion operator:

template <typname a, typname b>
friend int64 operator+(const a& lhs, const b& rhs) { return int64(lhs) += rhs; }

template <typname a, typname b>
friend int64 operator-(const a& lhs, const b& rhs) { return int64(lhs) -= rhs; }

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

هذا الموضوع مغلق.

مواضيع مشابهة