[[Template core/front/global/updateWarning is throwing an error. This theme may be out of date. Run the support tool in the AdminCP to restore the default theme.]]
أكثر ما أراه في أكواد المحترفين في ++C هو استخدامهم للــtemplates بشكل يثير الفضول ! لطالما حاولت قصر فهمي لها بأنه تأخذ وسيطاً بين<> وهو اسم النوع الذي نتعامل معه ... ولكنها كانت أروع من ذلك بكثيير ! في البداية كنت أحب استخدام #define فهي لغة بداخل اللغة وكان هذا ممتعاً .. أنت تكتب كود يغيّر نفسه .. ولكن وظيفة #define مقتصرة على استبدال معرّف ما بعبارة معيّنة , الاستبدال فقط .. لا يوجد توليد لأي شيء ..
بعد نظرتين وثلاث .. ولمحتها بالصدفة عدّة مرات .. لم أستطع مقاومة قراءة هذا الكود للأخ خالد في تلك المشاركة .. وأخيراً .. كلّمتني :) ... فهمتها .. وعلى الفور خطرت ببالي فكرة مرعبة ..
وبالفعل نجحت العودية .. لكن ليس هذا مطلبي ! لا أريد أن بتم الاستدعاء في الـ runtime .. أريد النتيجة جاهزة أول ما يشتغل الأخ البرنامج ! أريد أن تُحسب النتيجة في وقت التصريف Compile time.
المصرّف يقوم بما يلي : هل هناك استدعاء لدالة template ؟ هات الوسطاء وخلّيني أنشئ دالة لهذا الاستدعاء يعني السحر فقط بإنشاء دوال جديدة لكل استدعاء مختلف
الأخ Erwin Unruh هو أول من كتب كود meta programming
// Prime number computation by Erwin Unruhtemplate <int i>struct D{D(void*);operator int();};template <int p, int i>struct is_prime{ enum { prim = (p%i) && is_prime<(i > 2 ? p : 0), i -1> :: prim };};template < int i >struct Prime_print{ Prime_print<i-1> a; enum { prim = is_prime<i, i-1>::prim }; void f() { D<i> d = prim; }};struct is_prime<0,0> { enum {prim=1}; };struct is_prime<0,1> { enum {prim=1}; };struct Prime_print<2> { enum {prim = 1}; void f() { D<2> d = prim; }};#ifndef LAST#define LAST 10#endifmain () { Prime_print<LAST> a; }
صحيح أن الكود لم يعمل عندي كما يٌفترض به ( يعمل الكود بأن لا يعمل ولكن بطريقة احترافية يُفترض به أن يصدر errors تشير إلى رقم السطر الذي حدث فيه الخطأ , وأن تكون أرقام الأأسطر التي تسببت بالخطأ أوّليّة) ولكن لاحظت به عدّة أمور : enum ,و struct!! هذه أيضاً ما كنت أرفع عيني لأراها .. أنت يا enum .. جلست أسمع قصّتها .. ومعنا struct وجرى بيننا الحوار التالي :
تم النشر منذ
أكثر ما أراه في أكواد المحترفين في ++C هو استخدامهم للــtemplates بشكل يثير الفضول !
لما طبّقتها ..نجحت .. وقررت الخوض في الحديث .. يعني الكود التالي :لطالما حاولت قصر فهمي لها بأنه تأخذ وسيطاً بين<> وهو اسم النوع الذي نتعامل معه ... ولكنها كانت أروع من ذلك بكثيير !
في البداية كنت أحب استخدام #define فهي لغة بداخل اللغة وكان هذا ممتعاً .. أنت تكتب كود يغيّر نفسه ..
ولكن وظيفة #define مقتصرة على استبدال معرّف ما بعبارة معيّنة , الاستبدال فقط .. لا يوجد توليد لأي شيء ..
بعد نظرتين وثلاث .. ولمحتها بالصدفة عدّة مرات .. لم أستطع مقاومة قراءة هذا الكود للأخ خالد في تلك المشاركة ..
وأخيراً .. كلّمتني :) ... فهمتها .. وعلى الفور خطرت ببالي فكرة مرعبة ..
لكن ما حصل نصيب ! , يا أخي شيء عجيب ! لي بضعة أيام ,المصرّف يعرّفني على كل الأخطاء الموجودة عنده .. قال
حاولنا مع واسطة
وبالفعل نجحت العودية .. لكن ليس هذا مطلبي !
لا أريد أن بتم الاستدعاء في الـ runtime .. أريد النتيجة جاهزة أول ما يشتغل الأخ البرنامج ! أريد أن تُحسب النتيجة في وقت التصريف Compile time.
المصرّف يقوم بما يلي :
هل هناك استدعاء لدالة template ؟ هات الوسطاء وخلّيني أنشئ دالة لهذا الاستدعاء
يعني السحر فقط بإنشاء دوال جديدة لكل استدعاء مختلف
الأخ Erwin Unruh هو أول من كتب كود meta programming
صحيح أن الكود لم يعمل عندي كما يٌفترض به ( يعمل الكود بأن لا يعمل ولكن بطريقة احترافية يُفترض به أن يصدر errors تشير إلى رقم السطر الذي حدث فيه الخطأ , وأن تكون أرقام الأأسطر التي تسببت بالخطأ أوّليّة)
ولكن لاحظت به عدّة أمور : enum ,و struct!! هذه أيضاً ما كنت أرفع عيني لأراها .. أنت يا enum .. جلست أسمع قصّتها .. ومعنا struct
وجرى بيننا الحوار التالي :
ويا للعجب :) نجحت أخيراً ... قمت بكتابة أول MetaProgram ناجح .. وتم اختبار أولية العدد أثناء وقت التصريف compile time .
وعندما حاولت الذهاب بها بعيداً
انفجر الأب compiler :D في وجهي ..
وكانت هذه آخر مرة نتحدث فيها عن الموضوع .
0x36a2
شارك هذا الرد
رابط المشاركة
شارك الرد من خلال المواقع ادناه