सी ++ सादे पुराने डेटा (पीओडी) में कोई रनटाइम प्रकार की जानकारी नहीं है। वर्णित कक्षाएं सभी 1 बाइट लेती हैं, और खाली बेस क्लास ऑप्टिमाइज़ेशन वाले किसी भी कंपाइलर में समान रनटाइम प्रस्तुतिकरण होते हैं।
जैसा कि आप चाहते हैं कि नहीं किया जा सकता है।
बेस क्लास में वर्चुअल विनाशक जोड़ना आरटीटीआई में जोड़ता है, और dynamic_cast
समर्थन।
enum
या int
फ़ील्ड को उस आधार पर जोड़ना जो प्रत्येक व्युत्पन्न वर्ग के लिए अलग-अलग प्रारंभ होता है।
using my_type_id=void(*)();
template<class>void get_my_type_id_helper(){};
template<class T> my_type_id get_my_type_id(){return get_my_type_id_helper<T>;}
और फिर एक A
उचित रूप से प्रारंभ में my_type_id
भंडारण:
फिर भी एक और विकल्प तो जैसे एक टेम्पलेट समारोह बनाते हैं, और यह करने के लिए एक सूचक स्टोर करने के लिए, है। यह आरटीटीआई को पुनर्निर्मित कर रहा है, और जैसा कि आप अधिक सुविधाएं चाहते हैं, आप सी ++ आरटीटीआई ओवरहेड से संपर्क करेंगे।
सी ++ में आप केवल जो मांगते हैं उसके लिए भुगतान करते हैं: आप आरटीटीआई के बिना कक्षाओं के लिए पूछ सकते हैं, जो आपने किया था, और इसे प्राप्त किया।
आरटीटीआई रन टाइम टाइप जानकारी है। पीओडी सादा पुराना डेटा है, एक सी ++ 03 शब्द। कई कक्षाएं पीओडी नहीं हैं: virtual
विनाशक जोड़ने का आसान तरीका है। सी ++ 11 में अधिक बढ़िया मानक लेआउट और कुल शर्तें हैं।
तकनीकी रूप से आरटीटीआई और पीओडी एक दूसरे के विरोध नहीं हैं: ऐसे आरटीटीआई वाले वर्ग हैं जो पीओडी नहीं हैं।
ध्यान दें कि एमएसवीसी के पास आरटीटीआई उत्पन्न करने के विकल्प नहीं हैं और इसके आक्रामक कॉमडैट फोल्डिंग मानक के उल्लंघन में दोनों मामलों में मैन्युअल आरटीटीआई को तोड़ सकते हैं।
क्या आप 'dynamic_cast <>' के लिए पूछ रहे हैं? यह सी ++ 11 विशिष्ट नहीं है। –
कुछ भी नहीं बदला: मानक सी ++ में कोई प्रतिबिंब नहीं है। यदि आप रनटाइम प्रकार की जानकारी पर स्विच करना चाहते हैं, तो आप 'dynamic_cast' – quantdev
रुचि के हो सकते हैं: http://stackoverflow.com/q/25495733/596781 –