2011-08-22 9 views
9

मैं संकलित समय पर अपने व्युत्पन्न प्रकार के आधार पर कक्षा के लिए हैश उत्पन्न करना चाहता हूं। आज मुझे यह पसंद है उत्पन्न:सी ++ टाइप आईडी

template<class Type> 
class TypeBase 
{ 
public: 
    static const unsigned s_kID; 
}; 

template<class Type> 
const unsigned TypeBase<Type>::s_kID = hash(typeid(Type)); 

लेकिन यह उत्पन्न करता है (सुंदर अनावश्यक रूप से) चलाने के समय प्रवर्तन कोड

(हैश (..) समारोह एक सरल std :: type_info :: नाम() पर आधारित हैश करता है)

विचार?

+0

क्या कोई जोखिम नहीं है कि आपको हैश टकराव मिलते हैं या शायद यह कोई समस्या नहीं है? –

+0

@ एंड्रियास: हैश बनाते समय, मेरे पास हैश प्रविष्टियों के साथ एक नक्शा भी है। इस प्रकार मैं जांच कर सकता हूं कि टकराव हैं या नहीं। इसके अलावा, कक्षाओं की संख्या शायद 20 है, इसलिए मुझे लगता है कि मैं भी इसके साथ सुरक्षित हूं। – Robert

+0

क्या आप बस 'id = ++ someGlobalCounter' जैसी कुछ नहीं कर सके? (मुझे एहसास है कि यह पेट्रोफॉर्मेंस महत्वपूर्ण नहीं है, केवल उत्सुक है) –

उत्तर

3

प्रक्रिया स्टार्टअप पर होने वाली हर चीज को देखते हुए, और आपका मौजूदा कोड कितना सरल और सुरुचिपूर्ण है, यह मानते हुए कि आपके पास गजलियन प्रकार नहीं हैं, मैं आपके मौजूदा समाधान को ठीक उसी तरह छोड़ दूंगा।

+0

धन्यवाद। समयपूर्व अनुकूलन का मामला, आह? ;) – Robert

+0

वास्तव में। जब तक आपके पास ऐसे रनटाइम प्रभाव नहीं होते हैं, जो शिकायत कर रहे हैं कि एप्लिकेशन 150 माइक्रोसॉन्ड शुरू करने के लिए बहुत लंबा समय ले रहा है, तो इसे छोड़ दें। और उस चर के सूचक को हस्ताक्षर करने के लिए किसी भी जादू को करने की कोशिश न करें, क्योंकि यह पोर्टेबल नहीं होगा। – PlasmaHH

+0

@robert हाँ, ऐसा लगता है कि यह मुझे लगता है। –

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