سؤال

ما زلت أعمل على حل جيد مشكلة حاوية واحدة من النوع - وعند التفكير ، أعتقد أنه سيكون من الجيد أن تكون قادرًا على استخدام شيء مثل أ std::map<std::type_info, boost::any>. للأسف، std::type_info لا يحدد operator<, ، وأعتقد أنه سيكون من غير المعقول أن تحدد واحدة.

ومع ذلك ، يبدو من المعقول تحديد وظيفة التجزئة لها ، لأنه يمكنك ببساطة استخدام عنوان Singleton لـ std::type_info كائن باعتباره "تجزئة" معقولة. لذلك ، ستكون قادرًا على وضع ملف std::type_info الى std::unordered_map كمفتاح.

هل توفر C ++ 11 وظيفة تجزئة؟ سوف تستخدم عنوان ذاكرة std::type_info المفرد يكون استراتيجية هاش سيئة؟

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

المحلول

حقيقة ان type_info ليس أقل من قابلية المقارنة ليست مشكلة كبيرة لاستخدامها كمفتاح خريطة مثل حقيقة ذلك type_info غير قابل للتطبيق. :-)

في C ++ 03 ، type_info لديه before() وظيفة الأعضاء التي توفر طلب type_info أشياء.

في C ++ 11 ، type_info لديه hash_code() وظيفة العضو (C ++ 11 §18.7.1/7):

size_t hash_code() const throw();

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

ملاحظة: يجب أن يعيد التنفيذ قيمًا مختلفة لشخصين type_info الكائنات التي لا تقارن متساوين.

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

إذا كنت تستخدم type_info* كمفتاح خريطة ، كنت أستخدم مقارنة مخصصة تقوم بإزالة المؤشرات ويقارن type_info الكائنات نفسها (باستخدام المذكورة أعلاه before() أو hash_code() للطلب).

نصائح أخرى

يمكنك أيضا استخدام type_index, ، يحمل بأمان مؤشرًا على type_info ، يتم توفير وظيفة قابلة للنسخ وقابلة للمقارنة ويتم توفير وظيفة تجزئة للحاويات القياسية.

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