पहली नजर में यह साधारण सिन्थेटिक चीनी लगती है।
लेकिन जब हम गहराई से देखते हैं, तो हम इसे सिंटैक्टिक शुगर से अधिक देखते हैं, क्योंकि यह उपयोगकर्ता-परिभाषित प्रकार बनाने के लिए C ++ उपयोगकर्ता के विकल्पों का विस्तार करता है जो बिल्कुल अलग-अलग प्रकारों के समान व्यवहार करते हैं। इसमें, यह छोटा "बोनस" C ++ के अलावा एक बहुत ही दिलचस्प C ++ 11 है।
क्या हमें वास्तव में C ++ में इसकी आवश्यकता है?
पिछले वर्षों में मेरे द्वारा लिखे गए कोड में मुझे कुछ उपयोग दिखाई दे रहे हैं, लेकिन सिर्फ इसलिए कि मैंने इसे C ++ में उपयोग नहीं किया है, इसका मतलब यह नहीं है कि यह किसी अन्य C ++ डेवलपर के लिए दिलचस्प नहीं है ।
हमने C ++ (और C में, मुझे लगता है), संकलक-परिभाषित शाब्दिक का उपयोग किया था, पूर्णांक संख्याओं को लघु या दीर्घ पूर्णांक के रूप में टाइप करने के लिए, वास्तविक संख्या फ्लोट या डबल (या यहां तक कि डबल डबल) के रूप में और सामान्य या चौड़े वर्णों के रूप में वर्ण तार। ।
C ++ में, हमारे पास अपने स्वयं के प्रकार (यानी कक्षाएं) बनाने की संभावना थी , संभावित रूप से ओवरहेड (इनलाइनिंग, आदि) नहीं। हमारे पास ऑपरेटरों को उनके प्रकारों से जोड़ने की संभावना थी, उनके साथ समान निर्मित प्रकारों का व्यवहार करने की, जो C ++ डेवलपर्स को स्वाभाविक रूप से मैट्रिसेस और जटिल संख्याओं का उपयोग करने में सक्षम बनाता है जैसे कि अगर उन्हें भाषा में जोड़ा गया हो। हम कास्ट ऑपरेटरों को भी जोड़ सकते हैं (जो आमतौर पर एक बुरा विचार है, लेकिन कभी-कभी, यह सिर्फ सही समाधान है)।
उपयोगकर्ता-प्रकारों को अंतर्निहित प्रकारों के रूप में व्यवहार करने के लिए हम अभी भी एक चीज से चूक गए: उपयोगकर्ता-परिभाषित शाब्दिक।
इसलिए, मुझे लगता है कि यह भाषा के लिए एक प्राकृतिक विकास है, लेकिन जितना संभव हो उतना पूरा होने के लिए: " यदि आप एक प्रकार बनाना चाहते हैं, और आप चाहते हैं कि यह बिल्ट-इन प्रकारों के रूप में अधिक से अधिक संभव हो, तो यहां उपकरण हैं। .. "
मुझे लगता है कि यह प्रत्येक आदिम को एक संरचना बनाने के लिए .NET के निर्णय के समान है, जिसमें बूलियन, पूर्णांक, आदि शामिल हैं, और सभी संरचनाएं ऑब्जेक्ट से प्राप्त होती हैं। यह निर्णय अकेले ही .NET को परे ले जाता है जब आदिम के साथ काम करते समय जावा की पहुंच से कोई फर्क नहीं पड़ता है कि जावा अपने विनिर्देश में कितना बॉक्सिंग / अनबॉक्सिंग हैक करेगा।
क्या आपको वास्तव में C ++ में इसकी आवश्यकता है?
यह प्रश्न आपको उत्तर देने के लिए है। ब्रजेन स्ट्रॉस्ट्रुप नहीं। हर्ब सटर नहीं। जो भी C ++ मानक समिति का सदस्य नहीं है। यही कारण है कि आपके पास C ++ में विकल्प है , और वे अकेले निर्मित प्रकारों के लिए एक उपयोगी अंकन को प्रतिबंधित नहीं करेंगे।
यदि आपको इसकी आवश्यकता है, तो यह एक स्वागत योग्य है। अगर तुम नहीं, अच्छी तरह से ... यह प्रयोग नहीं करते। इसमें आपका कुछ भी खर्च नहीं होगा।
C ++ में आपका स्वागत है, वह भाषा जहाँ सुविधाएँ वैकल्पिक हैं।
फूला हुआ ??? मुझे अपने परिसरों दिखाओ !!!
फूला हुआ और जटिल (सजा का इरादा) के बीच अंतर है।
जैसे नील्स द्वारा दिखाया गया है कि उपयोगकर्ता-परिभाषित शाब्दिक C ++ में कौन सी नई क्षमताएं हैं? , एक जटिल संख्या लिखने में सक्षम होने के कारण C और C ++ में "हाल ही में" जोड़े गए दो विशेषताओं में से एक है:
// C89:
MyComplex z1 = { 1, 2 } ;
// C99: You'll note I is a macro, which can lead
// to very interesting situations...
double complex z1 = 1 + 2*I;
// C++:
std::complex<double> z1(1, 2) ;
// C++11: You'll note that "i" won't ever bother
// you elsewhere
std::complex<double> z1 = 1 + 2_i ;
अब, ऑपरेटर ओवरलोडिंग का उपयोग करते हुए, C99 "डबल कॉम्प्लेक्स" टाइप और C ++ "std :: कॉम्प्लेक्स" दोनों प्रकारों को गुणा, जोड़ा, घटाया आदि किया जा सकता है।
लेकिन C99 में, उन्होंने सिर्फ एक अन्य प्रकार को एक अंतर्निहित प्रकार के रूप में जोड़ा, और अंतर्निहित ऑपरेटर ओवरलोडिंग समर्थन। और उन्होंने एक और बिल्ट-इन शाब्दिक विशेषता जोड़ी।
C ++ में, उन्होंने भाषा की मौजूदा विशेषताओं का उपयोग किया, यह देखा कि शाब्दिक विशेषता भाषा का एक प्राकृतिक विकास था, और इस तरह इसे जोड़ा गया।
सी में, यदि आपको किसी अन्य प्रकार के लिए समान नोटिफिकेशन एन्हांसमेंट की आवश्यकता है, तो आप अपने क्वांटम वेव फ़ंक्शंस (या 3 डी पॉइंट्स, या जो भी बेसिक प्रकार आप अपने कार्य क्षेत्र में उपयोग कर रहे हैं) को जोड़ने के लिए अपनी पैरवी तक किस्मत से बाहर हैं। एक निर्मित प्रकार के रूप में सी मानक सफल होता है।
C ++ 11 में, आप इसे स्वयं कर सकते हैं:
Point p = 25_x + 13_y + 3_z ; // 3D point
क्या यह फूला हुआ है? नहीं , आवश्यकता है, जैसा कि दिखाया गया है कि कैसे C और C ++ कॉम्प्लेक्स दोनों को अपने शाब्दिक जटिल मूल्यों का प्रतिनिधित्व करने का एक तरीका चाहिए।
क्या यह गलत तरीके से डिजाइन किया गया है? नहीं , इसे हर दूसरे C ++ फीचर के रूप में डिज़ाइन किया गया है, जिसमें मन में विस्तार है।
क्या यह केवल संकेतन प्रयोजनों के लिए है? नहीं , क्योंकि यह आपके कोड में टाइप सुरक्षा भी जोड़ सकता है।
उदाहरण के लिए, आइए एक CSS उन्मुख कोड की कल्पना करें:
css::Font::Size p0 = 12_pt ; // Ok
css::Font::Size p1 = 50_percent ; // Ok
css::Font::Size p2 = 15_px ; // Ok
css::Font::Size p3 = 10_em ; // Ok
css::Font::Size p4 = 15 ; // ERROR : Won't compile !
मूल्यों के असाइनमेंट के लिए एक मजबूत टाइपिंग लागू करना बहुत आसान है।
खतरनाक है?
अच्छा प्रश्न। क्या इन कार्यों को नाम दिया जा सकता है? यदि हाँ, तो जैकपॉट!
वैसे भी, सब कुछ की तरह, आप खुद को मार सकते हैं यदि किसी उपकरण का अनुचित तरीके से उपयोग किया जाता है । सी शक्तिशाली है, और यदि आप सी बंदूक का दुरुपयोग करते हैं, तो आप अपने सिर को गोली मार सकते हैं। C ++ में C गन है, लेकिन स्केलपेल, टेसर और जो भी अन्य टूल आपको टूलकिट में मिलेगा। आप स्केलपेल का दुरुपयोग कर सकते हैं और खुद को मौत के घाट उतार सकते हैं। या आप बहुत ही सुंदर और मजबूत कोड बना सकते हैं।
तो, हर C ++ फीचर की तरह, क्या आपको वास्तव में इसकी आवश्यकता है? यह वह प्रश्न है जिसका उत्तर आपको C ++ में उपयोग करने से पहले देना चाहिए। यदि आप नहीं करते हैं, तो यह आपको कुछ भी खर्च नहीं करेगा। लेकिन अगर आपको वास्तव में इसकी आवश्यकता है, तो कम से कम, भाषा आपको निराश नहीं करेगी।
तारीख का उदाहरण?
आपकी त्रुटि, यह मुझे लगता है, यह है कि आप ऑपरेटरों को मिला रहे हैं:
1974/01/06AD
^ ^ ^
इसे टाला नहीं जा सकता, क्योंकि / एक ऑपरेटर होने के नाते, संकलक को इसकी व्याख्या करनी होगी। और, AFAIK, यह एक अच्छी बात है।
आपकी समस्या का हल खोजने के लिए, मैं शाब्दिक को किसी और तरीके से लिखूंगा। उदाहरण के लिए:
"1974-01-06"_AD ; // ISO-like notation
"06/01/1974"_AD ; // french-date-like notation
"jan 06 1974"_AD ; // US-date-like notation
19740106_AD ; // integer-date-like notation
व्यक्तिगत रूप से, मैं पूर्णांक और आईएसओ तिथियां चुनूंगा, लेकिन यह आपकी आवश्यकताओं पर निर्भर करता है। उपयोगकर्ता को अपने शाब्दिक नामों को परिभाषित करने देने का पूरा बिंदु कौन सा है।