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

تطبيقات على الـ templates

بدأه C++er في 17 مايو 2012 · 11 رد · 789 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

منذ ان تعلمت الـ template و انا لازلت اكتشف الكثير مما يمكننى ان أفعل بها، ايضا النتائج التى احصل عليها من الأفكار التى اطبقها تجعلنى اخمن كيف يعمل المترجم احيانا.

الهدف من هذا المثال هو الحصول على بعض البيانات المتعلقه بنوع معين. فعلى افتراض انك لن تستخدم Runtime Type Identification، إليك الفئه التاليه:

template<class t>
struct static_info
{
    static const bool is_integer;
    static const bool is_signed;
    static const bool is_pointer;
};

الكود التالي هو testcase لنسختك:

#include <iostream>
using namespace std;

#define GEN(T) { \
    typedef static_info<T> info; \
    cout << #T << " info:\n" << boolalpha \
         << "integer: " << info::is_integer \
         << ", signed: " << info::is_signed \
         << ", pointer: " << info::is_pointer << "\n\n"; }

int main()
{
  GEN(float)  // false, true, flase
  GEN(float*) // false, true, true

  GEN(short)  // true, true, false
  GEN(short*) // true, true, true

  GEN(unsigned)  // true, false, false
  GEN(unsigned*) // true, false, true
}

الكود السابق المفترض ان ينتج التالي:

float info:
integer: false, signed: true, pointer: false

float* info:
integer: false, signed: true, pointer: true

short info:
integer: true, signed: true, pointer: false

short* info:
integer: true, signed: true, pointer: true

unsigned info:
integer: true, signed: false, pointer: false

unsigned* info:
integer: true, signed: false, pointer: true

سأضع اجابتي لاحقا.

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

تم تعديل هذه المشاركة بواسطة Μωάμεθ αλάά في 17 مايو 2012 في 12:18

1

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

#2

ألا يعرف أحد الإجابه؟!!

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

#3

اذا كنت لا اعرف السؤال فكيف اعرف الاجابة ؟ :)

ثم انه كيف const بدون initialization ؟


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#4
اقتباس
ثم انه كيف const بدون initialization ؟

انت من سيقوم بكتابة الـ initialization.

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

#5

ها هي الإجابه:

template<class t>
struct is_ptr
{
    static const bool value = false;
};

template<class t>
struct is_ptr<t*>
{
    static const bool value = true;
};


template<class t>
struct static_info
{
    static const bool is_integer = ( t(5)/2 == 2 );
    static const bool is_signed  = ( t(0)-1 < t(0) );
    static const bool is_pointer = is_ptr<t>::value;
};

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

1

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

#6
اقتباس

انت من سيقوم بكتابة الـ initialization.

معذرة لقلة خبرتى فى هذه اللغة ++C

فكرة is_pointer جميلة جدا حيث يقوم المترجم(أظنه المعالج لانها فى ال Runtime) باختيار الفئة المناسبة لنوع المرسلات

ايضا is_integer و is_signed تعتمد على استدعاء البانى للفئة T ثم تنتظر نتيجة العملية الرياضية

صراحة مع ان الكود يبدو سهل الا انه جيد جدا ويوضح استخدام ما تعلمناه فى عمل ادوات مفيدة

شكرا لك اخى محمد فأنا تعلمت من كودك هذا نقاط جديدة وبالتأكيد سأستفيد منها مستقبلا

مشكور مرة ثانية على مشاركتنا مثل هذه الافكار

بالتوفيق


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#7
اقتباس
فكرة is_pointer جميلة جدا حيث يقوم المترجم(أظنه المعالج لانها فى ال Runtime) باختيار الفئة المناسبة لنوع المرسلات

عند استخدام اى من ثوابت الفئه static_info أو is_ptr يتم ابدال الإستدعاء بالنتيجه وقت الترجمه.

الجميل فى الفئه is_ptr انك يمكن ان تمرر لها مؤشر و تقوم هى بإعطائك النوع بدون المؤشر و ذلك لإستخدام كما تشاء مثل:

template<class t>
struct is_ptr
{
    typedef t type;
    static const bool value = false;
};

template<class t>
struct is_ptr<t*>
{
    typedef t type;
    static const bool value = true;
};

typedef char* astr;

int main()
{
    astr str = "test";

    is_ptr<astr>::type c = str[0];
}

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

1

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

#8
اقتباس

الجميل فى الفئه is_ptr انك يمكن ان تمرر لها مؤشر و تقوم هى بإعطائك النوع بدون المؤشر

ليست جميلة فقط بل رائعة

اقتباس

عند استخدام اى من ثوابت الفئه static_info أو is_ptr يتم ابدال الإستدعاء بالنتيجه وقت الترجمه.

هل هذا مايسمى بال MetaProgramming لاننا نستخدم القوالب Templates

ام فى كل الحالات . مثلا عند اعادة كتابة دالة Override ؟

وماذا لو كانت فى مكتبة ؟ وتستخدم مع برنامج يستعيد القيم من قاعدة البيانات ؟ أظنك فهمت ما أقصده

تحياتى

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 20 مايو 2012 في 20:13


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#9
اقتباس
هل هذا مايسمى بال MetaProgramming لاننا نستخدم القوالب Templates

بالضبط.

اقتباس

ام فى كل الحالات . مثلا عند اعادة كتابة دالة Override ؟

وماذا لو كانت فى مكتبة ؟ وتستخدم مع برنامج يستعيد القيم من قاعدة البيانات ؟ أظنك فهمت ما أقصده

لم أفهم قصدك.

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

#10

اقصد مثلا

string toString(int value)
{

}

string toString(double value)
{

}

لو كتبنا هذه الدوال فى فئة داخل مكتبة سواء dynamic او static

واستدعيناها من كود اخر بمرسلات arguments غير معروفة وقت الترجمة كان تأتى من قاعدة بيانات او غيره

الا يتم اختيار الدالة المناسبة لنوع المرسلات ؟ اذا هذه فى ال Runtime أليس كذلك ؟

خلاصة القول

اقتباس

عند استخدام اى من ثوابت الفئه static_info أو is_ptr يتم ابدال الإستدعاء بالنتيجه وقت الترجمه.

هل هذا مع MetaProgramming فقط ام دائما حتى لو لم تكن الفئة static_info من النوع templates ؟

تحياتى


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#11
اقتباس

لو كتبنا هذه الدوال فى فئة داخل مكتبة سواء dynamic او static

واستدعيناها من كود اخر بمرسلات arguments غير معروفة وقت الترجمة كان تأتى من قاعدة بيانات او غيره

الا يتم اختيار الدالة المناسبة لنوع المرسلات ؟ اذا هذه فى ال Runtime أليس كذلك ؟

عملية تحديد الداله التى سيتم إستدعائها تحدث وقت الترجمه لإنه إذا لم يستطيع المترجم تحديد أيهم سيتم إستدعائه سيظهر خطأ وقت الترجمه "ambiguous call to overloaded function".

اقتباس

هل هذا مع MetaProgramming فقط ام دائما حتى لو لم تكن الفئة static_info من النوع templates ؟

سواء مع الـ template او غيرها طالما ان قيمة الثابت يمكن معرفتها وقت الترجمه و لم يتم أخذ عنوان الثابت فسيقوم المترجم بتطبيق constant folding و إبدال الأماكن المستخدم فيها بقيمته.

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

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

#12
اقتباس

سيظهر خطأ وقت الترجمه "ambiguous call to overloaded function".

اوك وصلت الفكرة

شكرا لك


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

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