هل يوفر C ++ 11 وظائف التجزئة لـ Std :: Type_info؟
-
30-09-2019 - |
سؤال
ما زلت أعمل على حل جيد مشكلة حاوية واحدة من النوع - وعند التفكير ، أعتقد أنه سيكون من الجيد أن تكون قادرًا على استخدام شيء مثل أ 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 ، يتم توفير وظيفة قابلة للنسخ وقابلة للمقارنة ويتم توفير وظيفة تجزئة للحاويات القياسية.