जावा जेनरिक boost::any
को self
चर में C++ टेम्पलेट्स की तुलना में बस भरने के करीब हैं। कोशिश करो। सी ++ टेम्पलेट्स ऐसे प्रकार बनाते हैं जिनमें डिफ़ॉल्ट रूप से कोई रनटाइम या गतिशील रिलायंसशिप नहीं होती है।
आप एक सामान्य माता-पिता के माध्यम से मैन्युअल रूप से ऐसे रिश्ते को पेश कर सकते हैं और pImpl
और स्मार्ट पॉइंटर्स के विवेकपूर्ण उपयोग टाइप कर सकते हैं।
सी प्रकार भिन्नता तर्क सी ++ 11 में शैली से बाहर हैं। वेरियर्डिक टेम्पलेट तर्क बहुत ही सुरक्षित हैं, जब तक आपके कंपाइलर के लिए समर्थन है (एमएसवीसी 2012 के लिए नवंबर 2012 सीटीपी के लिए समर्थन (1, सीटीपी अपडेट नहीं), जैसा कि क्लैंग और जीसीसी के गैर-प्राचीन संस्करण हैं)।
सी ++ में टेम्पलेट्स मेटाप्रोग्रामिंग का एक प्रकार है, जो एक प्रोग्राम लिखने के करीब है जो जावा जेनरिक के मुकाबले एक प्रोग्राम लिखता है। जावा जेनेरिक में एक "बाइनरी" कार्यान्वयन साझा किया गया है, जबकि सी ++ टेम्पलेट का प्रत्येक उदाहरण एक पूरी तरह से अलग "प्रोग्राम" है (जो, COMDAT फोल्डिंग जैसी प्रक्रियाओं के माध्यम से, एक बाइनरी कार्यान्वयन में घटाया जा सकता है), जिसका विवरण टेम्पलेट द्वारा वर्णित है कोड।
template<typename T>
struct Field {
T data;
};
एक छोटा प्रोग्राम है जो कहता है "यहां फील्ड प्रकार कैसे बनाएं"। जब आप एक int
और double
में गुजरती हैं, संकलक इस तरह मोटे तौर पर कुछ करता है:
struct Field__int__ {
int data;
};
struct Field__double__ {
double data;
};
और जैसा कि आप उम्मीद नहीं होता इन दो प्रकार के बीच परिवर्तनीय किया जाना है।
struct Field {
boost::any __data__;
template<typename T>
T __get_data() {
__data__.get<T>();
}
template<typename T>
void __set_data(T& t) {
__data__.set(t);
}
property data; // reading uses __get_data(), writing uses __set_data()
};
जहां boost::any
एक कंटेनर है कि किसी भी प्रकार का एक उदाहरण हो सकते हैं, और data
क्षेत्र के लिए उपयोग है उन accessors के माध्यम से पुनर्निर्देश:
जावा जेनरिक, दूसरे हाथ पर, कुछ इस तरह बना सकते हैं।
सी ++ टेम्पलेट मेटाप्रोग्रामिंग का उपयोग कर जावा जेनरिक के बराबर कुछ लिखने का माध्यम प्रदान करता है। जावा में सी ++ टेम्पलेट्स जैसे कुछ लिखने के लिए, आपको अपने जावा प्रोग्राम आउटपुट कस्टम जावा बाइट या सोर्स कोड रखना होगा, फिर उस कोड को इस तरह से चलाएं जो डीबगर को उस कोड से कनेक्ट करने की अनुमति देता है जो कोड को स्रोत के रूप में लिखता है कीड़े का
विभिन्न टेम्पलेट तर्कों के साथ एक ही टेम्पलेट के इंस्टेंटेशन पूरी तरह से असंबंधित प्रकार हैं। एक बार आपके पास 'फ़ील्ड' ऑब्जेक्ट्स के साथ क्या करने की योजना है? सी ++ * करता है * [वैरैडिक टेम्पलेट्स] (http://en.wikipedia.org/wiki/Variadic_template) (जिसका उपयोग टाइपएफ़ वैरिएडिक फ़ंक्शंस बनाने के लिए किया जा सकता है)। – Mankarse
फ़ंक्शन केवल बाद में वेक्टर में प्रत्येक फ़ील्ड को छीनने जा रहा है, इसलिए मुझे वास्तव में परवाह नहीं है कि उनके प्रकार _are_ क्या हैं। सी ++ के variadics के प्रकार के सुरक्षा यहाँ, एक माध्यमिक चिंता वास्तव में है, क्योंकि कोड दुर्घटनाओं जब आप बुरा प्रकार में भेज अगर, अच्छी तरह से है कि तब ऐसा नहीं करते हैं (जो कोड है रक्षा और प्रकार की जाँच अपने आप को इससे पहले कि आप फ़ंक्शन को कॉल करें) । मैं जानता हूँ कि फील्ड और फील्ड वास्तव में संबंधित नहीं हैं कि (गैर (सह/विपरीत) -variance असंभव बना दिया (ठीक है, वास्तव में नहीं है, लेकिन द्वारा अजीब बनाया) गैर-वर्ग टेम्पलेट पैरामीटर)। –
@MattG तो फ़ील्ड सभी _one_ वेक्टर में जाते हैं? उस मामले में एक और भी कठिन सवाल यह होगा कि उस वेक्टर का प्रकार क्या होना चाहिए। – jogojapan