2012-03-25 14 views
20

मेरे पास कक्षा Base है और कक्षा Derived_1, Derived_2 ... मुझे आईडी प्राप्त करने के लिए व्युत्पन्न कक्षाओं की आवश्यकता है। उन आईडी का उपयोग आगे लुकअप आदि के लिए किया जाता है, और इस प्रकार लगातार होने की आवश्यकता होती है (केवल कुछ यादृच्छिक संख्या नहीं)। चूंकि व्युत्पन्न कक्षाएं उपयोगकर्ता द्वारा बनाई गई हैं, आईडी Derived_N का सदस्य नहीं हो सकती है। तो मैं DerivedType कक्षा के साथ आया था।मानचित्र में कुंजी के रूप में डेटा प्रकार (वर्ग प्रकार) का उपयोग करें

class DerivedType 
{ 
    static unsigned id; 
    unsigned m_id; 
public: 
    DerivedType() : m_id(id++) { } 
} 

अब मैं Derived_N और DerivedType के बीच एक मैपिंग बनाना चाहते हैं। जब भी Derived_N बनाई गई है, इस मानचित्रण अगर विशेष Derived_N के लिए DerivedType पहले से ही मौजूद लग रहा है और यह देता है, अन्यथा मानचित्र में नए और दुकानों पैदा करते हैं।

वास्तविक प्रश्न: वहाँ किसी भी तरह से के रूप में नक्शे में कुंजीडेटा प्रकार साथ std::map उपयोग करने के लिए है? मैं किसी भी टेम्पलेट-मेटाप्रोग्राम समाधान से डरता नहीं हूं। या क्या मेरा लक्ष्य हासिल करने का शानदार तरीका है?

संपादित दिनांक प्रकार -> डेटा प्रकार, मेरा मतलब है ClassType की तरह, मैं माफी चाहता हूँ :)

मैं इसे का उपयोग करना चाहते हैं:

Derived_5 d; 
DerivedType dt = getType(d); //Derived_5 is looked up in map, returning particular DerivedType 
dt.getId(); 

Derived_N के प्रत्येक उदाहरण (एक ही साथ ' एन ') DerivedType throu एक ही आईडी होना चाहिए

EDIT2 - मेरा जवाब मैं मेरी समस्या के लिए बेहतर समाधान पाया ... यह ली है ke इस:

atomic_counter s_nextEventClassID; 

typedef int cid_t; 

template<class EventClass> 
class EventClassID 
{ 
public: 
    static cid_t getID() 
    { 
     static cid_t classID = EventClassID::next(); 
     return classID; 
    } 

    static cid_t next() { return ++s_nextEventClassID; } 
}; 

के बाद से मेरे सवाल का कैसे एक नक्शे में डेटाप्रकार उपयोग करने के लिए था, मैं तुम्हारा जवाब में से कुछ का प्रतीक होगा, धन्यवाद

उत्तर

43

सी ++ 11 <typeindex> में std::type_index प्रदान करने, है, जो एक std::type_info उद्देश्य यह है कि साहचर्य कंटेनरों में कुंजी के रूप में इस्तेमाल किया जा सकता से निर्मित एक, copyable तुलनीय और hashable वस्तु है के द्वारा इस को हल करती है।

(कार्यान्वयन काफी सरल है, इसलिए यदि आपके पास सी ++ 11 नहीं है, तो आप कार्यान्वयन को चुरा सकते हैं, जीसीसी 4.7 कहें, और अपने कोड में इसका इस्तेमाल करें।)

#include <typeindex> 
#include <typeinfo> 
#include <unordered_map> 

typedef std::unordered_map<std::type_index, int> tmap; 

int main() 
{ 
    tmap m; 
    m[typeid(main)] = 12; 
    m[typeid(tmap)] = 15; 
} 
+1

यह स्वीकार जवाब – jupp0r

+0

बहुत अच्छा जवाब है जो आधुनिक सी का उपयोग किया जाना चाहिए ++ – Anonymous

0

आप उपयोग कर सकते हैं std::map की कुंजी के रूप में आप चाहते जो कुछ भी प्रकार या वर्ग , बशर्ते आप टेम्पलेट तर्कों को तुलनात्मक कार्य दें जो बताता है कि अंतर्निहित पेड़ को कैसे क्रमबद्ध किया जाए।

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

13

आप typeid(object) सीधे उपयोग कर सकते हैं, के बाद से वहाँ है type_info::before है, जो कि आप मानचित्र में कुंजी के रूप में type_info का उपयोग तुलनित्र के रूप में इस्तेमाल किया जा सकता, What is `type_info::before` useful for? देखते हैं। .name() प्राप्त करने की कोई आवश्यकता नहीं है।

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