c++ - how to call a function in C++11 templates only when its defined -
इस तरह एक साधारण टेम्पलेट परिदृश्य देख रहे हैं:
वर्ग ए {सार्वजनिक: int work (); }; वर्ग बी {सार्वजनिक: इंट काम (); }; कक्षा ऑब्जेक्ट प्रबंधक {सार्वजनिक: स्थिर शून्य प्रबंधन (ए एंड ओज); // प्रबंधन वर्ग बी} के लिए परिभाषित नहीं है; टेम्पलेट & lt; कक्षा T & gt; डस्टफ (टी टी) {टी। वर्क () .... ऑब्जेक्ट प्रबंधक :: प्रबंधन (टी); }; ए ए; बी बी; doStuf (क); doStuff (ख); मैं सोच रहा हूं, ObjectManager :: manage पर एक सशर्त कॉल को लागू करने का सबसे साफ तरीका क्या है? टेम्पलेट फ़ंक्शन को संकलित समय में निर्धारित करना चाहिए यदि ऑब्जेक्टमैनेजर :: प्रबंधन (टीटी) को दिए गए T के लिए परिभाषित किया गया है और कोड के कुछ लाइनों को केवल तभी सक्रिय करना चाहिए जब यह होगा। मुझे लगता है कि कुछ और नेस्टेड टेम्प्लेट कॉल के साथ समाधान हैं, लेकिन फ़ंक्शन को एक टुकड़े में रखने के लिए मेरे लिए सबसे अच्छा होगा।
ध्यान दें कि वर्तमान में आपका क्लास सदस्य सभी निजी हैं उन्हें सार्वजनिक किया जाना चाहिए।
टेम्प्लेट & lt; class T & gt; ऑटो कॉल_मेनिज (टी * टी) - & gt; Decltype (ऑब्जेक्ट मैनैजर :: प्रबंधन (* टी)) {लौटें ऑब्जेक्ट मैनेजर :: प्रबंधन (* टी); } शून्य कॉल_मेनिज (...) {} टेम्पलेट & lt; वर्ग T & gt; शून्य डस्टफ (टी टी) {टी। वर्क () // .... call_manage (std :: addressof (t)); // स्वाद जो भी अतिभारित यूपी ऑपरेटर & amp; यदि अभिव्यक्ति ObjectManager :: manage (* t) अच्छी तरह से बनाई गई है, फ़ंक्शन टेम्पलेट के लिए प्रतिस्थापन सफल होता है, जो हमेशा एक है ... की तुलना में बेहतर मिलान है, इसलिए इसे कहा जाता है अन्यथा, कुछ भी नहीं अधिभार एकमात्र व्यवहार्य फ़ंक्शन है। ।
उन लोगों के लिए जो संदर्भों को पसंद करते हैं:
टेम्पलेट & lt; class टी & gt; ऑटो कॉल_मेनिज (टी एंड amp) - & gt; Decltype (ObjectManager :: प्रबंधन (टी)) {लौटें ObjectManager :: प्रबंधन (टी); } टेम्पलेट & lt; कक्षा ... T & gt; शून्य कॉल_मेनिज (टी एंड amp; ...) {} टेम्पलेट & lt; कक्षा T & gt; शून्य डस्टफ (टी टी) {टी। वर्क () // .... call_manage (t); } इस मामले में, फ़ंक्शन टेम्प्लेट के लिए आंशिक क्रम के नियमों से एक-तर्क अधिभार भिन्नता संस्करण से अधिक विशिष्ट है, और अधिभार संकल्प द्वारा चयन किया जाता है यदि दोनों समान रूप से व्यवहार्य हैं। आप इसे T & amp; amp; और amp; एचटीएमएल>
Comments
Post a Comment