c++ - Template function in base class using this-pointer -
निम्न कोड पर विचार करें:
struct आधार {~ बेस () {} आभासी डबल ऑपरेटर () (डबल एक्स) const = 0; }; टेम्पलेट & lt; typename F, typename G & gt; रचना लिखें; // लिखित अभिव्यक्ति की घोषित घोषणा Derived1: सार्वजनिक बेस // अधिक कई व्युत्पन्न कक्षाएं {आभासी डबल ऑपरेटर () (डबल एक्स) const {return x;} टेम्पलेट & lt; typename F & gt; लिखें और & lt; Derived1, एफ & gt; ऑपरेटर () (कॉन्स्ट एफ एंड एफ) कॉन्स्ट {रिटर्न कलेक्स & लेफ्टिनेंट 1, एफ & gt; (* यह, च);}}; टेम्पलेट & lt; typename F, typename G & gt; संरचना लिखें: सार्वजनिक बेस {लिखें (कॉन्स्ट एफ एंड amp; _ एफ, कॉन्स्ट जी एंड डी जी): एफ (_ एफ), जी (_ जी) {} एफ एफ; जी जी; आभासी डबल ऑपरेटर () (डबल एक्स) const {रिटर्न एफ (जी (x));}}; शून्य परीक्षण () {Derived1 f, g; ऑटो h = f (g); } यहां पर लिखें वर्ग दो व्युत्पन्न कक्षाओं को एफ, जी लेता है और ऑपरेटर () के माध्यम से कंपोज़ीटम F (g (x)) देता है।
क्या यह किसी भी तरह संभव है कई व्युत्पन्न वर्गों में स्पष्ट परिभाषा से बचने के लिए, और बेस क्लास में कोई फ़ंक्शन जोड़ना
संपादित करें : मैं जो चाहूंगा उसे बेहतर समझने के लिए: सिद्धांत रूप में, मैं बेस क्लास में निम्नलिखित की तरह कुछ जोड़ना चाहता हूं टेम्पलेट & lt; typename F & gt; लिखें & lt; decltype (* this), F & gt; ऑपरेटर () (const F & amp; एफ) {वापसी लिखें & lt; decltype (* this), F & gt; (* यह, च);} मैंने इस आशा की कोशिश की थी कि decltype (* यह) स्वचालित रूप से व्युत्पन्न वर्ग के प्रकार सम्मिलित करता है। लेकिन ऐसा लगता नहीं है ...
समाधान : मुझे आखिरकार ऐसा करने का रास्ता मिला, और वह सीआरटीपी के माध्यम से है। बेस क्लास फिर प्रपत्र लेता है टेम्पलेट & lt; typename derived & gt; struct बेस {~ बेस () {} आभासी डबल ऑपरेटर () (डबल एक्स) const = 0; टेम्पलेट & lt; typename F & gt; लिखें & lt; व्युत्पन्न, एफ & gt; ऑपरेटर () (कॉन्स्ट एफ एंड एफ) {वापसी लिखें और लिफ्ट; लिखित, एफ & gt; (स्टेटिक_कास्ट & लेफ्टिनेंट; Derited const & amp; & gt; (* this), f);}}; और व्युत्पन्न कक्षाएं
struct derived1 से ली गई हैं: सार्वजनिक बेस & lt; Derived1 & gt;
यह देखते हुए कि आपका आधार शुद्ध वर्चुअल है बेस के लिए टेम्पलेट फ़ंक्शन। सभी व्युत्पन्न कक्षाओं को दोहरी ऑपरेटर () (डबल एक्स) को लागू करना होगा वैसे भी और प्रतिनिधि। इसके अलावा मैंने एक उदाहरण के बजाय एक बेस पॉइंटर का उपयोग किया क्योंकि जैसा कि आप बताते हैं कि यह अन्यथा (शायद बदलना चाहते हैं) लिखें में काम नहीं करेगा वहाँ इसे कम रिसाव प्रवण बनाने के लिए कार्यान्वयन ...)। ध्यान दें कि मैंने अपने पदानुक्रम से लिखें निकाला (ऐसा लगता है कि इसे और अधिक सामान्य प्रयोजन के लिए इस्तेमाल किया जा सकता है) - इसे वापस रखकर बेझिझक (यह इसके लिए अनुमति देगा अंतहीन रचना) इसके अलावा मैंने सभी const को हटा दिया क्योंकि const कोड के लिए डिफॉल्ट सीटीओआर की आवश्यकता होती है (उन में डाल करने के लिए बेझिझक)। और मैंने रचना ऑपरेटर का नाम बदला क्योंकि मेरा कंपाइलर क्लाइंट कोड में अन्य ऑपरेटर () द्वारा अंधा कर दिया गया था इसमें कोर की सफाई की आवश्यकता है:
टेम्पलेट & lt; typename F, typename G & gt; संरचना लिखें {लिखें (एफ * _ एफ, जी & amp; जी): एफ (_ एफ), जी (_ जी) {} एफ * एफ; जी जी; डबल ऑपरेटर () (डबल एक्स) {रिटर्न (* एफ) (जी (एक्स));}}; संरचना बेस {~ बेस () {} आभासी डबल ऑपरेटर () (डबल एक्स) = 0; टेम्पलेट & lt; typename F & gt; लिखें और & lt; बेस, एफ & gt; कंपोज़मेईथ (एफ एंड एफ) {रिटर्न लिखें लिफ्ट; बेस, एफ & gt; (यह, च);}}; संरचना डी 1: सार्वजनिक बेस {आभासी डबल ऑपरेटर () (डबल एक्स) {वापसी 1.0; }}; संरचना डी 2: सार्वजनिक बेस {आभासी डबल ऑपरेटर () (डबल एक्स) {रिटर्न 2.0; }}; कुछ क्लाइंट कोड:
#include & lt; iostream & gt; नेमस्पेस एसटीडी का उपयोग करना; int main (int argc, char ** argv) {D1 d1; डी 2 डी 2; ऑटो रेट 1 = डी 1 कॉमपास मेवथ (डी 2); ऑटो रेट 2 = डी 2 कॉमोज़ मिवथ (डी 1); Cout & lt; & lt; रेट 1 (100.0) & lt; & lt; endl; Cout & lt; & lt; रेट 2 (100.0) & lt; & lt; endl; }
Comments
Post a Comment