سؤال

C++ 0x وقد قالب الأسماء المستعارة (في بعض الأحيان يشار إلى قالب typedefs).انظر هنا.الحالي spec C++ لا.

ماذا كنت ترغب في استخدام العمل هنا ؟ حاوية الكائنات أو وحدات الماكرو ؟ هل تشعر يستحق ذلك ؟

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

المحلول

ماذا كنت ترغب في استخدام العمل هنا ؟ حاوية الكائنات أو وحدات الماكرو ؟ هل تشعر يستحق ذلك ؟

الكنسي طريقة هي استخدام metafunction مثل هكذا:

template <typename T>
struct my_string_map {
    typedef std::map<std::string, T> type;
};

// Invoke:

my_string_map<int>::type my_str_int_map;

هذا يستخدم أيضا في المحكمة الخاصة بلبنان (allocator::rebind<U>) و في العديد من المكتبات بما في ذلك زيادة.ونحن استخدامه على نطاق واسع في bioinformatical المكتبة.

انها منتفخة, لكنه أفضل بديل 99 ٪ من الوقت.باستخدام وحدات الماكرو هنا لا يستحق الكثير من سلبيات.

(تحرير:لقد تعديل قانون لتعكس زيادة/STL الاتفاقيات كما أشار دانيال في تعليق له.)

نصائح أخرى

template <typename T>
struct my_string_map : public std::map<std::string,T> 
{
};

يجب أن لا ترث من الفئات التي لا تملك الظاهري المدمر.انها تتعلق المتلفات في الفئات المشتقة من عدم استدعائه عندما ينبغي أن يكون وما يمكن أن ينتهي بك الأمر مع الذاكرة مخصصة.

أن يقال لك أن *****ربما***** الحصول على بعيدا مع أنها في المثال أعلاه لأنك لا إضافة المزيد من البيانات إلى نوع مشتق.لاحظ أن هذا ليس إقرارا.ما زلت المشورة لك لا تفعل ذلك.حقيقة أن كنت يمكن تفعل ذلك لا يعني أنك يجب أن.

تحرير:نعم, هذا هو الرد إلى ShaChris23 بعد.ربما فاتني شيء لأنه ظهر فوق رسالته بدلا من أدناه.

في بعض الأحيان يمكنك فقط صراحة كتابة untemplated typedefs لجميع الأنواع الضرورية.إذا كانت قاعدة الطبقة قالب على قالب متعددة وسائط مع نوع واحد فقط المطلوب أن يكون typedefed يمكن أن ترث فئة متخصصة مع الرموز المميزة ل typedef بفعالية المدرجة في ورثت اسم الفئة.هذا النهج هو أقل صعب من metafunction النهج.

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