2013-08-20 8 views
7

मैं सी ++ 11 सीख रहा हूं, और उपयोगकर्ता द्वारा परिभाषित साहित्य में रूचि रखता हूं। तो मैंने इसके साथ थोड़ा सा खेलने का फैसला किया।सी ++ 11 उपयोगकर्ता परिभाषित अक्षर

int n = 1000_000_000; 

मैं सी ++ 11 में इस सुविधा का अनुकरण करने की कोशिश की: कुछ भाषाओं में इस तरह एक वाक्य रचना की है।

inline constexpr unsigned long long operator "" _000 (unsigned long long n)noexcept 
{ 
     return n * 1000; 
} 

inline constexpr unsigned long long operator "" _000_000 (unsigned long long n)noexcept 
{ 
     return n * 1000*1000; 
} 

inline constexpr unsigned long long operator "" _000_000_000 (unsigned long long n)noexcept 
{ 
     return n * 1000*1000*1000; 
} 

int main(){ 
    constexpr auto i = 100_000; // instead of 100000 
    constexpr auto j = 23_000_000; // instead of 23000000; 
} 

लेकिन सामान्य मामले के लिए मैं यह अनुकरण नहीं कर सकता है, यानी

ऑटो general_case = 123_456_789; //

मेरा प्रश्न है "क्या मैं सी ++ 11 का उपयोग कर उपरोक्त सामान्य मामले के लिए अनुकरण कर सकता हूं?"।

+2

क्या यह 1_000_000 के लिए काम करता है? मैं व्यक्तिगत रूप से कस्टम उपयोगकर्ता अक्षर और अक्षरों के एम एम (किलो मेगा गिगा) का उपयोग करता हूं। – dtech

+0

1_000_000 संकलित !!! –

+0

@ddriver केवल उस समस्या के साथ है, तो आप – aaronman

उत्तर

4

भाषा के सी ++ 11 संस्करण में उपयोगकर्ता परिभाषित अक्षर के साथ यह संभव नहीं है क्योंकि यह अभी है। उपयोगकर्ता परिभाषित अक्षर पैरामीटर के लिए सीमित प्रारूप का समर्थन करते हैं, दाएं तरफ पैरामीटर का समर्थन करने के लिए प्रतीत नहीं होता है, साथ ही संख्याओं का प्रतिनिधित्व करने की समस्या है जो वास्तविक संख्या के रूप में 0 से शुरू होती है। तो यह कोई नहीं है।

आप वर्तमान दृष्टिकोण _000 को परिभाषित करते हैं और स्टैंडअलोन अक्षर के रूप में, इसलिए संकलक केवल उनके साथ काम करेगा और कोई अन्य नहीं। यह _ जैसा ऑपरेटर नहीं है और 000 कुछ पैरामीटर है जिसे आप दुर्भाग्य से काम कर सकते हैं।

हालांकि आप इसके बजाय अक्षर प्रत्यय का उपयोग कर सकते हैं।

long long constexpr operator"" K (long double n) { 
    return n * 1000; 
} 
long long constexpr operator"" M (long double n) { 
    return n * 1000000; 
} 
long long constexpr operator"" G (long double n) { 
    return n * 1000000000; 
} 

और फिर:

0.05M == 50000; 
123.232K == 123232 
1.000000001G == 1000000001 

निश्चित रूप से, पिछले मामले तरह के प्रयोजन को हरा देता है क्योंकि एक बार फिर से आप दृश्य संकेत के बिना कई शून्य है ... तो तुम जैसे कुछ के लिए जा सकते हैं:

1.G + 1 == 1000000001 // much clearer 1 billion + 1 

इससे थोड़ा बदसूरत हो जाता है, क्योंकि शाब्दिक वास्तविक संख्या की अपेक्षा करता है और एक पूर्णांक के साथ काम नहीं करेगा जब तक आप पूर्णांक के साथ उपयोग करने के लिए अतिरिक्त अक्षर परिभाषित नहीं करते हैं। फिर आप इसके बजाय 1 जी का उपयोग कर सकते हैं।

इसके अलावा, यह दृष्टिकोण संभवतः कंपाइलर चेतावनियों का उत्पादन करेगा, जाहिर है कि सी ++ समूह उन सभी प्रत्ययों को आरक्षित करना चाहता है जो "भविष्य के उपयोग" के लिए अंडरस्कोर से पहले नहीं हैं। अगर आप चेतावनियां चाहते हैं, तो इसके बजाय _K _M और _G का उपयोग करें।

संपादित करें: मैंने प्रारंभकर्ता सूची समाधान हटा दिया है, क्योंकि यह 010 जैसी संख्याओं के साथ अमान्य परिणाम उत्पन्न करता है, जिसे ऑक्टल के रूप में संसाधित किया जाता है और गणना को गड़बड़ कर दिया जाता है।

+0

हाँ, यदि समस्या कई पिछली ज़ीरो है, तो आपने समस्या का समाधान किया है, लेकिन आपने सामान्य मामले के लिए इसे हल नहीं किया है (उदाहरण के लिए '123456789' ->' 123456.789K' -> '123.456789M' -> कोई स्पष्ट नहीं लाभ) –

+0

@ लाइटनेसरेसेसिन ऑर्बिट - मैं मानता हूं कि यह बहुत अधिक व्यर्थ है, हालांकि यह अभी भी ओपी के उदाहरण के रूप में उपयोगी है, जो स्पष्ट रूप से सचमुच गलत पाया गया है। मुझे वास्तव में आरएचएस पैरामीटर और चेनिंग के लिए उम्मीद थी, ऐसा लगता है कि उनके वर्तमान रूप में शाब्दिक प्राथमिक हैं। – dtech

संबंधित मुद्दे