"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > आप C++ में वर्चुअल टेम्पलेट विधियों के साथ बहुरूपता कैसे प्राप्त कर सकते हैं?

आप C++ में वर्चुअल टेम्पलेट विधियों के साथ बहुरूपता कैसे प्राप्त कर सकते हैं?

2024-11-08 को प्रकाशित
ब्राउज़ करें:805

How can you achieve polymorphism with virtual template methods in C  ?

C वर्चुअल टेम्पलेट विधि

सी में, स्थिर समय बहुरूपता (टेम्पलेट्स) को रनटाइम बहुरूपता के साथ जोड़ना चुनौतीपूर्ण हो सकता है। यह निम्नलिखित अमूर्त वर्ग में स्पष्ट है:

class AbstractComputation {
    public:
        template  virtual void setData(std::string id, T data);
        template  virtual T getData(std::string id);
};

इस वर्ग का लक्ष्य एक विशिष्ट पहचानकर्ता के आधार पर एक निर्दिष्ट प्रकार का डेटा सेट करना और पुनर्प्राप्त करना है। हालाँकि, जेनेरिक सेटडेटा फ़ंक्शन को एक विशिष्ट प्रकार के साथ कॉल करने का प्रयास करते समय एक समस्या उत्पन्न होती है, जैसे कि setData("foodouble", data).

भाषा इस निर्माण को प्रतिबंधित करती है क्योंकि कंपाइलर को गतिशील रूप से काम करना होगा संभावित टेम्पलेट इन्स्टेन्शियेशन की अनंत संख्या भेजें। इस समस्या को हल करने के लिए, कई दृष्टिकोण संभव हैं:

स्थैतिक बहुरूपता को हटाना:

  • कुंजी-मूल्य को संग्रहीत करने के लिए एक अलग प्रकार की शुरुआत करके स्थैतिक बहुरूपता को खत्म करें मानचित्रण। टेम्पलेट बहुरूपता की आवश्यकता के बिना, इसे आधार स्तर पर हल कर सकता है:
class AbstractComputation {
public:
   template 
   void setData( std::string const & id, T value ) {
      m_store.setData( id, value );
   }
   template 
   T getData( std::string const & id ) const {
      return m_store.getData( id );
   }
protected:
   ValueStore m_store;
};

गतिशील बहुरूपता को हटाना:

  • रनटाइम बहुरूपता को बनाए रखें लेकिन प्रकार मिटाकर स्थैतिक बहुरूपता को समाप्त करें:
  • बूस्ट का उपयोग करें::कोई भी, जो किसी भी प्रकार के डेटा को संग्रहीत करने के लिए टाइप इरेज़र प्रदान करता है:
class AbstractComputation {
public:
   template 
   void setData( std::string const & id, T value ) {
      setDataImpl( id, boost::any( value ) );
   }
   template 
   T getData( std::string const & id ) const {
      boost::any res = getDataImpl( id );
      return boost::any_cast( res );
   }
protected:
   virtual void setDataImpl( std::string const & id, boost::any const & value ) = 0;
   virtual boost::any getDataImpl( std::string const & id ) const = 0;
};
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3