सी ++ पुस्तकालयों के लोड, मानक शामिल, आपको पुस्तकालयों में उपयोग के लिए अपनी वस्तुओं को अनुकूलित करने की अनुमति देता है। पसंद अक्सर एक सदस्य समारोह या एक ही नामस्थान में एक मुक्त समारोह के बीच होता है।मुक्त कार्यों या सदस्य कार्यों के माध्यम से विस्तार के यांत्रिकी
मैं मैकेनिक्स जानना चाहता हूं और कॉल को प्रेषित करने के लिए लाइब्रेरी कोड का उपयोग करता हूं जो इन "एक्सटेंशन" कार्यों में से एक को कॉल करेगा, मुझे पता है कि यह निर्णय संकलन समय के दौरान होना चाहिए और टेम्पलेट्स शामिल करना होगा। निम्नलिखित रनटाइम psuedocode संभव/गैर-अर्थ नहीं है, कारण इस प्रश्न के दायरे से बाहर हैं।
if Class A has member function with signature FunctionSignature
choose &A.functionSignature(...)
else if NamespaceOfClassA has free function freeFunctionSignature
choose freeFunctionSignature(...)
else
throw "no valid extension function was provided"
उपरोक्त कोड रनटाइम कोड की तरह दिखता है: /। तो, लाइब्रेरी एक नामस्थान नामस्थान को कैसे समझती है, यह तीन स्थितियों का पता कैसे लगाती है, इससे बचने की ज़रूरत वाले अन्य नुकसान क्या हैं।
मेरे प्रश्न के लिए प्रेरणा मेरे लिए पुस्तकालयों में प्रेषण ब्लॉक खोजने में सक्षम होना है, और अपने कोड में संरचनाओं का उपयोग करने में सक्षम होना है। तो, विस्तृत उत्तरों मदद मिलेगी।
!! जीतने के लिए !!
ठीक है तो स्टीव (और टिप्पणियों) एडीएल और एसएफआईएनएई के उत्तर के अनुसार संकलन समय पर प्रेषण को तारों के तारों के लिए महत्वपूर्ण संरचनाएं हैं। मुझे अपना सिर एडीएल (प्राइमेटिवली) और एसएफआईएनएई (फिर से रूढ़िवादी) के आसपास मिला है। लेकिन मुझे नहीं पता कि वे किस तरह से सोचते हैं कि वे कैसे सोचते हैं।
मैं एक उदाहरण उदाहरण देखना चाहता हूं कि इन दो संरचनाओं को एक साथ कैसे रखा जा सकता है ताकि पुस्तकालय संकलित समय पर चयन कर सके कि किसी ऑब्जेक्ट में उपयोगकर्ता द्वारा समर्थित सदस्य फ़ंक्शन को कॉल किया जाए या उपयोगकर्ता द्वारा प्रदान की गई निःशुल्क फ़ंक्शन प्रदान की गई हो एक ही ऑब्जेक्ट का नामस्थान। यह केवल उपरोक्त दो संरचनाओं का उपयोग करके किया जाना चाहिए, किसी भी प्रकार का रनटाइम प्रेषण नहीं होना चाहिए।
आइए प्रश्न में ऑब्जेक्ट को NS::Car
कहा जाता है, और इस ऑब्जेक्ट को MoveForward(int units)
का व्यवहार सदस्य कार्य के रूप में प्रदान करने की आवश्यकता है। यदि ऑब्जेक्ट के नामस्थान से व्यवहार को उठाया जाना है तो यह शायद MoveForward(const Car & car_, int units)
जैसा दिखेगा। आइए उस फ़ंक्शन को परिभाषित करें जो mover(NS::direction d, const NS::vehicle & v_)
प्रेषण करना चाहता है, जहां दिशा एक enum है, और v_ NS::car
का आधार वर्ग है।
आप स्ट्रीम में आउटपुट करने के लिए अपनी कक्षा में 'ऑपरेटर <<' ओवरराइड नहीं कर सकते हैं। एक सदस्य ऑपरेटर को ऑपरेटर के बाईं ओर कक्षा होना चाहिए, दाईं ओर नहीं। इसके अलावा, नाम लुकअप कंपाइलर का हिस्सा है, लाइब्रेरी नहीं, और टेम्पलेट क्लास या टेम्पलेट फ़ंक्शन शामिल होने पर केवल टेम्पलेट्स को शामिल करेगा। यदि आप पूछ रहे हैं कि नाम लुकअप कैसे किया जाता है, तो कृपया अपने प्रश्न को स्पष्ट करें। अन्यथा, मुझे नहीं पता कि आप क्या पूछ रहे हैं। –
@ डेविड हाँ, मैं 'ऑपरेटर के बारे में गलत था <<' मैंने उदाहरण हटा दिया, लेकिन कोई मेरा प्रश्न संपादित कर रहा था और हटाने को ओवरराइट कर रहा था: डी –