यहां हम C++ में उपयोगकर्ता-परिभाषित लिटरल्स (User Defined Literals - UDL) की अवधारणा देखेंगे। C++11 संस्करण से, उपयोगकर्ता-परिभाषित लिटरल्स C++ में जोड़े गए हैं। C++ बिल्ट-इन प्रकारों के लिए लिटरल्स प्रदान करता है लेकिन ये सीमित हैं।
बिल्ट-इन लिटरल्स:
- 31 (पूर्णांक)
- 3.5 (डबल)
- 4.2F (फ्लोट)
- 'p' (कैरेक्टर)
- 31ULL (अनसाइन्ड लॉन्ग लॉन्ग)
- 0xD0 (अनसाइन्ड हेक्साडेसिमल पूर्णांक)
- "pq" (स्ट्रिंग)
बिल्ट-इन लिटरल्स के अलावा, कभी-कभी हमें उपयोगकर्ता-परिभाषित लिटरल्स की आवश्यकता होती है। इसके कुछ कारण हैं। आइए कुछ उदाहरणों से समझते हैं:
मान लीजिए हम एक वजन वेरिएबल परिभाषित करना चाहते हैं, लेकिन हम इकाइयां निर्दिष्ट नहीं कर सकते, जैसे यदि हम परिभाषित करते हैं:
long double Weight = 3.5;
हमें इकाई के बारे में कोई जानकारी नहीं है (पाउंड? किलोग्राम? ग्राम?) लेकिन UDL का उपयोग करके हम मान के साथ इकाइयां जोड़ सकते हैं। इसके कुछ लाभ हैं: यह कोड को अधिक पठनीय बनाता है और कंपाइल टाइम पर रूपांतरण का समर्थन करता है।
weight = 5.6kg; ratio = 5.6kg/2.1lb;
उपरोक्त अनुपात को खोजने के लिए उन्हें समान इकाइयों में बदलना आवश्यक है। लेकिन UDLs हमें इकाई अनुवाद लागत को दूर करने में मदद करते हैं। इस मामले में, हम उपयोगकर्ता-परिभाषित प्रकारों के लिए उपयोगकर्ता-परिभाषित लिटरल्स और बिल्ट-इन प्रकारों के लिए लिटरल्स के नए रूप परिभाषित कर सकते हैं। UDLs कोडिंग समय को ज्यादा नहीं बचाते लेकिन अधिक से अधिक गणनाओं को कंपाइल-टाइम पर स्थानांतरित किया जा सकता है जिससे तेज़ निष्पादन होता है।
उदाहरण
बेहतर समझ के लिए निम्न कार्यान्वयन देखें:
#include<iostream> #include<iomanip> using namespace std; unsigned long long int operator"" _kb( unsigned long long int x ) { return x*1024; } unsigned long long int operator"" _b( unsigned long long int x ) { return x; } unsigned long long int operator"" _mb( unsigned long long int x ) { return x * 1024 * 1024; } int main() { unsigned long long int size = 24_kb; cout << "Size:" << size << endl; cout << "Few more MB:" << ( size + 2_mb ) << endl; cout << "Size Div:" <<( 10_kb / 2_kb ) << endl; cout << "1KB = " <<( 8_b * 128_b ) << endl; return 0; } आउटपुट
Size:24576 Few more MB:2121728 Size Div:5 1KB = 1024