आम तौर पर, अगर मैं एक Foo
, या एक Bar
है, मैं की तरह कुछ करना होगा:क्या एक सामान्य विधि या कक्षा बनाना संभव है जिसे कोई भी किसी भी वर्ग के "नए" उदाहरण बनाने के लिए उपयोग कर सकता है?
Foo* foo = new Foo();
Bar* bar = new Bar(2,3,5);
वहाँ टेम्पलेट्स या मैक्रो का उपयोग कर एक रास्ता है, कि मैं एक समारोह का निर्माण कर सकते हैं, जैसे कि मैं की तरह कुछ कर सकते हैं :
Foo* foo = MyAwesomeFunc(Foo);
Bar* bar = MyAwesomeFunc(Bar,2,3,5);
MyAwesomeFunc
की वास्तविक विधि हस्ताक्षर मेरे लिए महत्वपूर्ण नहीं है।
Foo
और Bar
किसी भी संभव तरीके से संबंधित की जरूरत नहीं सकता है, और पूरी तरह से अलग कंस्ट्रक्टर्स हो सकता है। इसके अतिरिक्त, मैं भविष्य में MyAwesomeFunc
कोड को वास्तव में संशोधित किए बिना भविष्य में किसी भी वर्ग का समर्थन करना चाहूंगा? क्या यह संभव है? एक आसान तरीका दोनों Foo
और कुछ प्रकार से Bar
इनहेरिट, कहते हैं कि Baz
, और अतिभारित तरीकों वापसी एक Baz
, जो आप Foo
या Bar
वापस करने के लिए डाली है करने के लिए किया जाएगा ...
Baz* MyAwesomeFunc(){
return new Foo();
}
Baz* MyAwesomeFunc(int a,int b,int c){
return new Bar(a,b,c);
}
लेकिन यहाँ समस्या है आप लिखने के लिए होगा:
- प्रत्येक वर्ग के लिए एक विधि समर्थित
- और निर्माता हस्ताक्षर के प्रत्येक प्रकार के लिए।
लक्ष्य, एक एकल वर्ग, विधि, या मैक्रो, जहां हम कॉल एक समारोह (और यह किसी भी तर्क से पारित), लेकिन कॉल कर सकते हैं वस्तु में पारित की सही निर्माता लिखने के लिए है। क्या यह संभव है ?
इस सवाल का उद्देश्य बस अगर यह सी में इस तरह कुछ करने के लिए संभव है ++ जा सकता है। कृपया साझा पॉइंटर्स, अद्वितीय पॉइंटर्स, नए का उपयोग करने के नुकसान को न लाएं, क्योंकि यह विषय बंद है।
संपादित करें: मैं सी ++ 11 के बाद से केवल एसटीएल
देखें 'बूस्ट :: फैक्टरी' – Ari0nhh
@Ar i0nhh धन्यवाद एर - बूस्ट का उपयोग किये बिना आसानी से ऐसा करने का कोई तरीका? –
प्री सी ++ 11, "परफेक्ट फॉरवर्डिंग" और "वैराडिक टेम्पलेट्स" मौजूद नहीं थे। 'बूस्ट' ने समुदाय को बेवकूफ शक्तिशाली कोड बनाने के लिए उपकरणों के साथ आपूर्ति की और 'बूस्ट :: फैक्ट्री' डिफैक्टो फैक्ट्री थी जिसे पूर्ण अग्रेषण और विविध टेम्पलेट्स द्वारा पार किया गया है। – Gambit