C++
RTTI: रन-टाइम टाइप की जानकारी
खोज…
एक प्रकार का नाम
आप क्रम में एक प्रकार के कार्यान्वयन को परिभाषित नाम पुनः प्राप्त कर सकते हैं .name()
का उपयोग करके std::type_info
.name()
std::type_info
सदस्य समारोह std::type_info
ऑब्जेक्ट typeid
द्वारा लौटाया गया है।
#include <iostream>
#include <typeinfo>
int main()
{
int speed = 110;
std::cout << typeid(speed).name() << '\n';
}
आउटपुट (कार्यान्वयन-परिभाषित):
int
dynamic_cast
एक फ़ंक्शन के रूप में dynamic_cast<>()
उपयोग करें, जो आपको वंशानुगत पदानुक्रम ( मुख्य विवरण ) के माध्यम से नीचे लाने में मदद करता है।
यदि आपको कुछ व्युत्पन्न वर्गों B
और C
पर कुछ गैर-बहुरूपी कार्य करना चाहिए, लेकिन आधार class A
प्राप्त किया है, तो इसे निम्न प्रकार से पढ़ें:
class A { public: virtual ~A(){} };
class B: public A
{ public: void work4B(){} };
class C: public A
{ public: void work4C(){} };
void non_polymorphic_work(A* ap)
{
if (B* bp =dynamic_cast<B*>(ap))
bp->work4B();
if (C* cp =dynamic_cast<C*>(ap))
cp->work4C();
}
टाइप करने वाला कीवर्ड
typeid
कीवर्ड एक typeid
ऑपरेटर होता है, जो यदि ऑपरेंड का प्रकार एक पॉलीमॉर्फिक क्लास प्रकार है, तो उसके ऑपरेंड के बारे में रन-टाइम टाइप जानकारी देता है। यह प्रकार const std::type_info
। शीर्ष स्तर के cv- योग्यता की अनदेखी की जाती है।
struct Base {
virtual ~Base() = default;
};
struct Derived : Base {};
Base* b = new Derived;
assert(typeid(*b) == typeid(Derived{})); // OK
typeid
को सीधे एक प्रकार पर भी लागू किया जा सकता है। इस मामले में, पहले शीर्ष-स्तरीय संदर्भों को छीन लिया जाता है, फिर शीर्ष-स्तरीय सीवी-योग्यता की अनदेखी की जाती है। इस प्रकार, उपरोक्त उदाहरण typeid(Derived{})
बजाय typeid(Derived)
साथ लिखा जा सकता है:
assert(typeid(*b) == typeid(Derived{})); // OK
यदि typeid
किसी भी अभिव्यक्ति है कि बहुरूपी वर्ग प्रकार की नहीं है करने के लिए लागू किया जाता है, संकार्य मूल्यांकन नहीं किया जाता है, और प्रकार की जानकारी लौटे स्थिर प्रकार के लिए है।
struct Base {
// note: no virtual destructor
};
struct Derived : Base {};
Derived d;
Base& b = d;
assert(typeid(b) == typeid(Base)); // not Derived
assert(typeid(std::declval<Base>()) == typeid(Base)); // OK because unevaluated
सी ++ में किस कास्ट का उपयोग कब करना है
वंशानुक्रम पदानुक्रम के भीतर बिंदु / संदर्भ परिवर्तित करने के लिए डायनेमिक_का उपयोग करें।
साधारण प्रकार के रूपांतरणों के लिए static_cast का उपयोग करें।
बिट-पैटर्न के निम्न-स्तर के रीइंटरेन्टरिंग के लिए रीइंटरेक्ट_का उपयोग करें। अत्यधिक सावधानी के साथ उपयोग करें।
दूर / अस्थिर कास्टिंग के लिए const_cast का उपयोग करें। इससे बचें जब तक कि आप एक कास्ट-गलत एपीआई का उपयोग करके अटक नहीं जाते हैं।