C++ प्रोग्रामिंग में, स्टैंडर्ड टेम्प्लेट लाइब्रेरी (STL) से 'std::any' विषम डेटा को संभालने के लिए एक गतिशील टाइपिंग पेश करता है। पारंपरिक कंटेनरों के विपरीत, 'std::any' एक ही कंटेनर के भीतर किसी भी प्रकार के मूल्यों को संग्रहीत करने की अनुमति देता है, उन परिदृश्यों में लचीलेपन को बढ़ाता है जहां डेटा प्रकार अज्ञात हैं या रनटाइम पर भिन्न होते हैं। यह प्रकार-अज्ञेयवादी दृष्टिकोण एक सामान्य प्रोग्रामिंग को बढ़ावा देता है जो डेवलपर्स को प्रकार की सुरक्षा बनाए रखते हुए अधिक अनुकूलनीय और अभिव्यंजक कोड बनाने का अधिकार देता है। इस अन्वेषण में, हम 'std::any' की विशेषताओं, इसके उपयोग पैटर्न और व्यावहारिक उदाहरणों पर ध्यान देंगे जो एक मजबूत और लचीले C++ कोड को लिखने में इसकी भूमिका को दर्शाते हैं।
उदाहरण 1: Std::Any का मूल उपयोग
सबसे पहले, आइए 'std::any' के मूलभूत उपयोग को प्रदर्शित करने के लिए एक सीधा उदाहरण देखें। ऐसे परिदृश्य पर विचार करें जहां आपको विभिन्न प्रकार के मापदंडों को स्वीकार करने के लिए एक फ़ंक्शन की आवश्यकता है:
यहाँ कोड स्निपेट है:
#शामिल करें
#शामिल <कोई भी>
शून्य प्रक्रियाकोई भी ( स्थिरांक std::कोई भी & कीमत ) {
अगर ( value.has_value ( ) ) {
std::cout << 'संग्रहीत मूल्य का प्रकार:' << मान प्रकार ( ) ।नाम ( ) << std::endl;
अगर ( मान प्रकार ( ) ==टाइपिड ( int यहाँ ) ) {
std::cout << 'कीमत: ' << std::any_cast < int यहाँ > ( कीमत ) << std::endl;
} अन्य अगर ( मान प्रकार ( ) ==टाइपिड ( दोहरा ) ) {
std::cout << 'कीमत: ' << std::any_cast < दोहरा > ( कीमत ) << std::endl;
} अन्य अगर ( मान प्रकार ( ) ==टाइपिड ( एसटीडी::स्ट्रिंग ) ) {
std::cout << 'कीमत: ' << std::any_cast < एसटीडी::स्ट्रिंग > ( कीमत ) << std::endl;
} अन्य {
std::cout << 'असमर्थित प्रकार!' << std::endl;
}
} अन्य {
std::cout << 'std::any में कोई मान संग्रहीत नहीं है।' << std::endl;
}
}
मुख्य प्रवेश बिंदु ( ) {
कोई भी प्रक्रिया ( 42 ) ;
कोई भी प्रक्रिया ( 3.14 ) ;
कोई भी प्रक्रिया ( एसटीडी::स्ट्रिंग ( 'हैलो, एसटीडी::कोई भी!' ) ) ;
कोई भी प्रक्रिया ( 4.5f ) ; // असमर्थित प्रकार
वापस करना 0 ;
}
इस उदाहरण में, हम 'processAny' फ़ंक्शन को परिभाषित करते हैं जो पैरामीटर के रूप में 'std::any' संदर्भ लेता है और इसकी सामग्री की जांच करता है। फ़ंक्शन के अंदर, हम पहले जांचते हैं कि क्या 'std::any' वेरिएबल में has_value() का उपयोग करके संग्रहीत मान है। यदि कोई मान मौजूद है, तो हम type().name() का उपयोग करके संग्रहीत मान का प्रकार निर्धारित करते हैं और उसके प्रकार के आधार पर संबंधित मान को प्रिंट करने के लिए आगे बढ़ते हैं। फिर मुख्य फ़ंक्शन 'processAny' को विभिन्न प्रकारों से कॉल करके उसकी उपयोगिता प्रदर्शित करता है: एक पूर्णांक (42), एक डबल (3.14), और एक स्ट्रिंग ('हैलो, std::any!')। फ़ंक्शन प्रत्येक प्रकार को उचित रूप से संभालता है और संबंधित मानों को प्रिंट करता है। हालाँकि, जब एक फ़्लोटिंग-पॉइंट नंबर (4.5f) को संसाधित करने का प्रयास किया जाता है, जो इस उदाहरण में असमर्थित है, तो प्रोग्राम यह संकेत देकर स्थिति को संभालता है कि प्रकार असमर्थित है।
उत्पन्न आउटपुट है:
यह दर्शाता है कि कैसे 'std::any' विभिन्न डेटा प्रकारों के गतिशील प्रबंधन को सक्षम बनाता है, जिससे यह C++ में सामान्य प्रोग्रामिंग के लिए एक बहुमुखी उपकरण बन जाता है।
उदाहरण 2: उपयोगकर्ता-परिभाषित प्रकारों को संग्रहीत करना
दूसरा उदाहरण यह बताता है कि मानक टेम्पलेट लाइब्रेरी (एसटीएल) के भीतर यह गतिशील प्रकार कस्टम डेटा संरचनाओं को सहजता से कैसे समायोजित करता है। उपयोगकर्ता-परिभाषित प्रकार, बिंदु संरचना पर ध्यान केंद्रित करते हुए, हम दिखाते हैं कि 'std::any' ऐसी संरचनाओं के उदाहरणों को कैसे संभालता है।
यहाँ कोड है:
#शामिल करें#शामिल <कोई भी>
क्लास माईक्लास {
जनता:
मेरी कक्षा ( पूर्णांक मान ) : डेटा ( कीमत ) { }
शून्य प्रिंटडेटा ( ) कॉन्स्ट {
std::cout << 'माईक्लास में डेटा:' << डेटा << std::endl;
}
निजी:
पूर्णांक डेटा;
} ;
मुख्य प्रवेश बिंदु ( ) {
std::कोई भी वस्तु = MyClass ( 42 ) ;
अगर ( AnyObject.has_value ( ) ) {
ऑटो & myClassInstance = std::any_cast < मेरी कक्षा &> ( कोई भी वस्तु ) ;
myClassInstance.printData ( ) ;
} अन्य {
std::cout << 'std::any में कोई मान संग्रहीत नहीं है।' << std::endl;
}
वापस करना 0 ;
}
इस C++ कोड स्निपेट में, हम 'MyClass' नामक उपयोगकर्ता-परिभाषित वर्ग के साथ 'std::any' प्रकार का उपयोग करके वर्णन करने के लिए एक सरल उदाहरण बनाते हैं। कक्षा के भीतर, इस डेटा के मूल्य को प्रदर्शित करने के लिए 'डेटा' नामक एक निजी सदस्य चर और प्रिंटडेटा () नामक एक सार्वजनिक विधि है। एक पूर्णांक मान पारित किया जाता है और कंस्ट्रक्टर में 'डेटा' सदस्य को सौंपा जाता है।
'मुख्य' फ़ंक्शन में, हम 'MyClass' के एक ऑब्जेक्ट को 42 के प्रारंभिक मान के साथ इंस्टेंट करते हैं और फिर इसे 'anyObject' नामक 'std::any' वेरिएबल में संग्रहीत करते हैं। यह उपयोगकर्ता-परिभाषित कक्षाओं के उदाहरणों को रखने के लिए 'std::any' की क्षमता को प्रदर्शित करता है।
इसके बाद, हम has_value() पद्धति का उपयोग करके यह जांचने के लिए 'if' कथन का उपयोग करते हैं कि 'anyObject' का कोई मान है या नहीं। यदि कोई मान है, तो हम 'std::any_cast' का उपयोग करके संग्रहीत ऑब्जेक्ट को पुनः प्राप्त करते हैं। संग्रहीत ऑब्जेक्ट को 'MyClass' के संदर्भ में डालने के लिए 'std::any_cast' को 'MyClass&' टेम्पलेट तर्क के साथ नियोजित किया जाता है। यह संदर्भ, 'myClassInstance', तब printData() विधि को कॉल करने के लिए उपयोग किया जाता है, जो 'std::any' के भीतर संग्रहीत उपयोगकर्ता-परिभाषित प्रकार तक पहुंचने और संचालित करने की क्षमता प्रदर्शित करता है।
यदि 'std::any' में कोई मान संग्रहीत नहीं है, तो हम इसे सूचित करने वाला एक संदेश प्रिंट करते हैं। यह सशर्त जांच सुनिश्चित करती है कि हम उन परिदृश्यों को संभालें जहां 'std::any' चर खाली हो सकता है।
यहाँ आउटपुट है:
उदाहरण 3: मिश्रित प्रकार के कंटेनर
प्रोग्रामिंग में, एक 'मिश्रित प्रकार का कंटेनर' एक डेटा संरचना को संदर्भित करता है जो विविध, संभावित रूप से असंबंधित डेटा प्रकारों के तत्वों को धारण करने में सक्षम है। यह लचीलापन उन परिदृश्यों से निपटने में मूल्यवान है जहां संकलन समय पर डेटा प्रकार अज्ञात हैं या प्रोग्राम निष्पादन के दौरान गतिशील रूप से बदल रहे हैं। C++ में, 'std::any' इस अवधारणा का उदाहरण देता है, जो विभिन्न प्रकार के मूल्यों को संग्रहीत करने के लिए एक एकल कंटेनर के निर्माण की अनुमति देता है।
आइए एक ऐसे परिदृश्य का पता लगाएं जहां हम एक कंटेनर बनाते हैं जिसमें विभिन्न प्रकार होते हैं:
#शामिल करें#शामिल <कोई भी>
#शामिल <वेक्टर>
मुख्य प्रवेश बिंदु ( ) {
एसटीडी::वेक्टर < एसटीडी::कोई भी > मिश्रितकंटेनर;
MixedContainer.push_back ( 42 ) ;
MixedContainer.push_back ( 3.14 ) ;
MixedContainer.push_back ( एसटीडी::स्ट्रिंग ( 'नमस्ते' ) ) ;
MixedContainer.push_back ( सत्य ) ;
के लिए ( स्थिरांक ऑटो & तत्व: मिश्रितकंटेनर ) {
अगर ( तत्व.प्रकार ( ) ==टाइपिड ( int यहाँ ) ) {
std::cout << 'पूर्णांक:' << std::any_cast < int यहाँ > ( तत्व ) << std::endl;
} अन्य अगर ( तत्व.प्रकार ( ) ==टाइपिड ( दोहरा ) ) {
std::cout << 'दोहरा: ' << std::any_cast < दोहरा > ( तत्व ) << std::endl;
} अन्य अगर ( तत्व.प्रकार ( ) ==टाइपिड ( एसटीडी::स्ट्रिंग ) ) {
std::cout << 'डोरी: ' << std::any_cast < एसटीडी::स्ट्रिंग > ( तत्व ) << std::endl;
} अन्य अगर ( तत्व.प्रकार ( ) ==टाइपिड ( बूल ) ) {
std::cout << 'बूलियन:' << std::any_cast < बूल > ( तत्व ) << std::endl;
} अन्य {
std::cout << 'अज्ञात प्रकार' << std::endl;
}
}
वापस करना 0 ;
}
इस चित्रण में, हम C++ और 'std::any' सुविधा का उपयोग करके मिश्रित प्रकार के कंटेनर की अवधारणा को प्रदर्शित करते हैं। हम विभिन्न डेटा प्रकारों के तत्वों को रखने के लिए हमारे कंटेनर के रूप में काम करने के लिए 'mixedContainer' नामक 'std::vector
जैसे ही हम 'फॉर' लूप का उपयोग करके 'मिक्स्डकंटेनर' के माध्यम से पुनरावृति करते हैं, हम प्रत्येक तत्व के डेटा प्रकार को गतिशील रूप से पहचानने के लिए टाइप() फ़ंक्शन को नियोजित करते हैं। 'std::any_cast' का उपयोग करते हुए, हम उनके प्रकार के आधार पर संबंधित मान निकालते और प्रिंट करते हैं। उदाहरण के लिए, यदि तत्व 'int' प्रकार का है, तो हम इसे पूर्णांक के रूप में प्रिंट करते हैं। यदि यह 'डबल' प्रकार का है, तो हम इसे डबल के रूप में प्रिंट करते हैं, इत्यादि।
यहाँ उत्पन्न आउटपुट है:
उदाहरण 4: Std::Any के साथ त्रुटि प्रबंधन
'std::any' का उपयोग करते समय त्रुटियों को संभालने में यह जांचना शामिल है कि क्या प्रकार समर्थित है या कोई मान संग्रहीत है या नहीं। इस उदाहरण में, हम प्रदर्शित करते हैं कि असमर्थित प्रकारों को कैसे संभालना है:
#शामिल करें#शामिल <कोई भी>
मुख्य प्रवेश बिंदु ( ) {
std::कोई भी myAny = 42 ;
कोशिश {
दोहरा मान = std::any_cast < दोहरा > ( मेरा कोई ) ;
std::cout << 'कीमत: ' << कीमत << std::endl;
} पकड़ना ( स्थिरांक std:: Bad_any_cast & यह है ) {
std::cerr << 'गलती: ' << ई.क्या ( ) << std::endl;
}
वापस करना 0 ;
}
हम पूर्णांक प्रकार के 42 के मान के साथ 'std::any' वेरिएबल, 'myAny' को प्रारंभ करके प्रारंभ करते हैं। अगले 'कोशिश' ब्लॉक के अंदर, हम 'std::any_cast
इस संभावित त्रुटि को शानदार ढंग से प्रबंधित करने के लिए, हम 'कैच' ब्लॉक के साथ अपवाद हैंडलिंग को कार्यान्वित करते हैं जिसे 'std:: Bad_any_cast' के विशिष्ट अपवाद प्रकार को पकड़ने के लिए डिज़ाइन किया गया है। असफल कास्ट की स्थिति में, 'कैच' ब्लॉक सक्रिय हो जाता है और हम त्रुटि की प्रकृति को बताने के लिए 'std::cerr' का उपयोग करके एक त्रुटि संदेश उत्पन्न करते हैं। यह त्रुटि-हैंडलिंग रणनीति यह सुनिश्चित करती है कि हमारा प्रोग्राम उन स्थितियों को शानदार ढंग से संभाल सकता है जहां प्रयास किया गया प्रकार 'std::any' वेरिएबल में संग्रहीत वास्तविक प्रकार के साथ टकराता है।
निष्कर्ष
इस लेख में, हमने C++ में 'std::any' के अनुप्रयोगों का पता लगाया, एक गतिशील प्रकार का कंटेनर जिसे C++ में विभिन्न प्रकार के मानों के लिए पेश किया गया है। हमने विभिन्न उदाहरणों के माध्यम से इसकी बहुमुखी प्रतिभा का प्रदर्शन किया, जिसमें बुनियादी उपयोग से लेकर उपयोगकर्ता-परिभाषित प्रकारों और विषम संग्रहों को संभालने तक के परिदृश्य प्रदर्शित किए गए। हमने उन परिदृश्यों में इसके व्यावहारिक अनुप्रयोग का प्रदर्शन किया जहां संकलन समय पर डेटा का प्रकार ज्ञात नहीं है। इसके अतिरिक्त, हमने त्रुटि-हैंडलिंग तकनीकों के बारे में पता लगाया, जिसमें अपवाद हैंडलिंग के माध्यम से असमर्थित प्रकारों को शानदार ढंग से प्रबंधित करने के महत्व पर जोर दिया गया।