2010-08-23 3 views
7

मैं अभी भी अपने One-Of-A-Type Container Problem के अच्छे समाधान पर काम कर रहा हूं - और प्रतिबिंब पर मुझे लगता है कि std::map<std::type_info, boost::any> जैसे कुछ का उपयोग करने में सक्षम होना अच्छा होगा। दुर्भाग्यवश, std::type_infooperator< को परिभाषित नहीं करता है, और मुझे लगता है कि इसे परिभाषित करने के लिए यह अनुचित होगा।क्या सी ++ 11 std :: type_info के लिए हैशिंग फ़ंक्शन प्रदान करता है?

हालांकि, इसके लिए हैश फ़ंक्शन को परिभाषित करना उचित लगता है, क्योंकि आप std::type_info ऑब्जेक्ट के सिंगलटन पते को उचित "हैश" के रूप में उपयोग कर सकते हैं। इसलिए, आप std::type_info को std::unordered_map में कुंजी के रूप में डाल पाएंगे।

क्या सी ++ 11 ऐसे हैश फ़ंक्शन प्रदान करता है? std::type_info सिंगलटन के मेमोरी एड्रेस का उपयोग करना एक खराब हैश रणनीति हो?

+2

यह एक सिंगलटन नहीं है, वैसे, लेकिन एक स्थिर आवंटित वस्तु। – GManNickG

+0

@GMan: क्या अंतर है? –

+1

यदि यह सिंगलटन था, तो वास्तव में एक 'type_info' ऑब्जेक्ट होगा। चूंकि प्रोग्राम में कई प्रकार हैं, इसलिए प्रोग्राम में एक से अधिक 'type_info' ऑब्जेक्ट होना चाहिए। –

उत्तर

9

तथ्य यह है कि type_info तुलनात्मक से कम नहीं है, इसे मानचित्र कुंजी के रूप में उपयोग करने के लिए उतनी ही समस्या नहीं है क्योंकि type_info गैर-प्रतिलिपि है। :-)

सी ++ 03, type_info में before() सदस्य फ़ंक्शन है जो type_info ऑब्जेक्ट्स का ऑर्डर प्रदान करता है।

size_t hash_code() const throw(); 

रिटर्न: एक unspeci फाई एड मूल्य, कि एक के भीतर छोड़कर

C++ में 11, type_info एक hash_code() सदस्य समारोह (सी ++ 11 §18.7.1/7) है कार्यक्रम का एकल निष्पादन, यह किसी भी दो type_info वस्तुओं के बराबर मूल्य की तुलना करेगा जो बराबर तुलना करते हैं।

टिप्पणी: एक कार्यान्वयन को दो type_info ऑब्जेक्ट्स के लिए अलग-अलग मान वापस करना चाहिए जो बराबर की तुलना नहीं करते हैं।

type_info वस्तुओं typeid ऑपरेटर से उत्पन्न कार्यक्रम के अंत तक मौजूद हैं, तो यह एक नक्शे के प्रमुख के रूप में एक type_info* उपयोग करने के लिए सुरक्षित है। हालांकि, मेरे सबसे अच्छे ज्ञान के लिए, इस बात की कोई गारंटी नहीं है कि यदि आप typeid को उसी प्रकार की दो ऑब्जेक्ट्स पर लागू करते हैं तो आपको उसी type_info ऑब्जेक्ट के दो संदर्भ प्राप्त होंगे।

आप एक नक्शा कुंजी के रूप में type_info* का उपयोग करते हैं, तो मुझे लगता है कि संकेत dereferences और तुलना type_info खुद को वस्तुओं एक कस्टम तुलनित्र (ऊपर उल्लिखित before() या hash_code() आदेश देने के लिए उपयोग करते हुए) का उपयोग करेंगे।

+0

@ जेम्स: डी ओह! शायद मैं 'std :: type_info *' का उपयोग कर सकता हूं (क्योंकि एक विशेष टाइप_इनो क्लास का केवल एक बार उदाहरण है?)? –

+0

@ बिली: यह सुरक्षित होना चाहिए (चेतावनी के लिए मेरा संपादन देखें)। –

+0

@ जेम्स: यह मुश्किल हो सकता है क्योंकि 'std :: type_info' ऑब्जेक्ट्स स्वयं की तुलना करने का एक प्रभावी तरीका प्रदान नहीं करते हैं। ऐसा लगता है कि यह मेरे लिए होम ब्रू समाधान पर वापस आ गया है:/ –

10

आप type_index का भी उपयोग कर सकते हैं, यह सुरक्षित रूप से एक टाइप_इनोफ़ो के लिए एक पॉइंटर रखता है, यह कॉपी करने योग्य, तुलनात्मक और मानक कंटेनर के लिए हैश फ़ंक्शन प्रदान किया जाता है।

संबंधित मुद्दे