سؤال

في C ++ Template Metaprogramming: المفاهيم والأدوات والتقنيات من دفعة وما بعدها

... عيب واحد من قوالب التعبير هو أنهم يميلون إلى تشجيع كتابة التعبيرات الكبيرة المعقدة، لأن التقييم يتأخر إلا حتى يتم استدعاء مشغل الواجب. إذا أراد برنامج مبرمج إعادة استخدام بعض النتيجة المتوسطة دون تقييمها مبكرا، فقد تضطر إلى إعلان نوع معقد مثل:

Expression<
           Expression<Array,plus,Array>,
           plus,
           Expression<Array,minus,Array>
          > intermediate = a + b + (c - d);

(او أسوأ). لاحظ كيف لا يعكس هذا النوع بالضبط فقط وبشكل راض عن بنية حسابية، لذا، سيحتاج إلى الحفاظ على تغييرات الصيغة ولكن أيضا تطغى عليه؟ هذه مشكلة طويلة الأمد ل C ++ Dsels. الحل المعتاد هو التقاط التعبير باستخدام محو النوع، ولكن في هذه الحالة يدفع المرء للإرسال الديناميكي. كانت هناك الكثير من المناقشة مؤخرا، وتقوم بتقييم bjarne stroustrup نفسه، حول إعادة استخدام الكلمة الرئيسية للسيارات الآثارية للحصول على خصم النوع في تصريحات متغيرة، بحيث يمكن إعادة كتابة ما ورد أعلاه على النحو التالي:

auto intermediate = a + b + (c - d);

ستكون هذه الميزة ميزة ضخمة للمؤلفين C ++ DST والمستخدمين على حد سواء ...

هل من الممكن حل هذه المشكلة مع STD C ++ الحالي. (غير C ++ 0x)

على سبيل المثال أريد أن أكتب تعبيرا مثل:

expr x، ذ

مصفوفة أ، ب، ج، د

X = A + B + C

Y = X + C

D: = x + y

حيث المشغل: = تقييم التعبير في آخر مرة.

هل كانت مفيدة؟

المحلول

في الوقت الحالي، يمكنك دائما استخدام boost_auto () في مكان كل الكلمة الأساسية للسيارات C ++ للحصول على نتائج وسيطة بسهولة أكبر.

Matrix x, y;
BOOST_AUTO(result, (x + y) * (x + y)); // or whatever.

نصائح أخرى

أنا لا أفهم سؤالك. auto سوف يتم إعادة استخدامها في C++0x بالنسبة استنتاج النوع التلقائي.

أنا شخصيا أرى هذا كعسمة لقوالب التعبير لأنها غالبا ما تتابع على وجود فترة حياة أصغر من الكائنات التي يتم بناؤها والتي يمكن أن تتحول إليها أن تكون خاطئة إذا تم القبض على قالب التعبير كما أشرح هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top