2012-05-08 5 views
5

सी ++ में यह निर्धारित करना संभव है कि टाइप ए के एक चर को using std::is_convertible<A, B> द्वारा बी प्रकार में परिवर्तित किया जा सकता है या नहीं।std :: is_convertible type_info

यदि आप वास्तव में ए और बी के प्रकार जानते हैं, तो यह अच्छी तरह से काम करता है, लेकिन मेरे पास टाइप_इनफॉस है। तो मैं जो खोज रहा हूं वह इस तरह का एक कार्य है:

bool myIsConvertible(const type_info& from, const type_info& to); 

क्या सी ++ में ऐसा कुछ लागू करना संभव है? यदि हां, तो कैसे?

+5

मुझे नहीं लगता कि यह संभव है। लेकिन असली सवाल यह है कि, आप इस तरह के एक समारोह के साथ क्या करेंगे? – Nawaz

+0

इसके अलावा, आपके पास केवल 'type_info' क्यों होगा? – mfontanini

+0

"यदि आप वास्तव में ए और बी प्रकार जानते हैं तो यह अच्छी तरह से काम करता है"।ठीक है, लेकिन आप कैसे प्रकारों को नहीं जानते? – jrok

उत्तर

1

मुझे लगता है कि यदि आप अपने चर के टाइपिड को जानते हैं तो यह किया जा सकता है, जिसे आप हमेशा सी ++ में टाइपिड ऑपरेटर का उपयोग करके जान सकते हैं।

Derived* pd = new Derived; 
    Base* pb = pd; 
    cout << typeid(pb).name() << endl; //prints "class Base *" 
    cout << typeid(*pb).name() << endl; //prints "class Derived" 
    cout << typeid(pd).name() << endl; //prints "class Derived *" 

तो फिर तुम बनाना होगा एक multimap या typeid के रूप में कुंजी (जो आप जानना चाहते हैं, तो करने के लिए परिवर्तनीय है) convertible type ids (convertable प्रकार) के रूप में और मूल्य के साथ की तरह है, तो कहाँ। यहां इस मामले में आप मानचित्र पर पहुंच सकते हैं यदि key आपके मामले में const type_info& from में valueconst type_info& to पर मैप किया गया है। यदि हां तो आप true या false के रूप में बूल वापस कर सकते हैं। लेकिन इस मामले में आपको यह सुनिश्चित करने की ज़रूरत है कि आप कोड में सभी वर्गों और विरासत को सही तरीके से देखें। और आधार पर यह तय करता है कि यह कानूनी रूपांतरण होगा और उस आधार पर मानचित्र पर जोड़ें। लेकिन यह एक कठिन प्रक्रिया होगी और मुझे इसका कोई उपयोग नहीं दिखता है।

सामान्य रूप से सी ++ आपको dynamic cast के माध्यम से बताता है यदि किसी प्रकार को अन्य प्रकार में डाला जा सकता है या ठीक से नहीं। जबकि static_cast भी एक दूसरे के लिए असंगत प्रकार डालेगा और इसका अनुचित उपयोग रन-टाइम त्रुटि

4

पोर्टेबल सी ++ में जो भी आप चाहते हैं उसे करने के लिए संभव नहीं है।

यह एक आंशिक जवाब अगर आप अपने आप को किसी दिए गए मंच के लिए प्रतिबंधित प्राप्त करने के लिए संभव हो सकता है। उदाहरण के लिए उन प्लेटफार्मों कि Itanium ABI का पालन इस समारोह के एक कार्यान्वयन होगा:

extern "C" 
void* __dynamic_cast(const void *sub, 
        const abi::__class_type_info *src, 
        const abi::__class_type_info *dst, 
        std::ptrdiff_t src2dst_offset); 

इस ABI में, abi::__class_type_info एक प्रकार std::type_info से ली गई है, और कार्यक्रम में सभीstd::type_info रों एक गतिशील प्रकार व्युत्पन्न है है std::type_info से (abi::__class_type_info केवल एक उदाहरण होने के नाते)।

इस एबीआई का उपयोग करना एक ऐसा उपकरण बनाना संभव है जो किसी भी प्रकार (रन टाइम पर) के उत्तराधिकारी पदानुक्रम को नेविगेट करेगा, इसके std::type_info दिए गए हैं। और ऐसा करने में आप यह निर्धारित कर सकते हैं कि दो std::type_info एस दो प्रकार का प्रतिनिधित्व करते हैं जो dynamic_cast या static_cast एक दूसरे के लिए भी हो सकते हैं।

ध्यान दें कि ऐसा समाधान किसी कनवर्टिंग कन्स्ट्रक्टर या रूपांतरण ऑपरेटर का उपयोग करके प्रकारों में परिवर्तित नहीं होगा। और भले ही वह प्रतिबंध स्वीकार्य है, मैं इस मार्ग की अनुशंसा नहीं करता हूं। यह एक आसान परियोजना नहीं है, और बहुत त्रुटि होगी प्रवण। लेकिन शायद यह है कि आपका सी ++ कार्यान्वयन dynamic_cast लागू करता है, इसलिए यह स्पष्ट रूप से असंभव नहीं है।

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