2013-05-16 11 views
22

पर विचार करें:सी ++ 11 ऑपरेटर "" डबल पैरामीटर के साथ

:

struct str {}; 

str operator"" _X(long double d) { 
    return str(); 
} 

इस ग्राम के साथ ++ 4.7.2 दीवार एसटीडी = C++ 11

लेकिन अब अगर मैं एक डबल देना ठीक संकलित

str operator"" _X(double d) { 
    return str(); 
} 

मैं निम्न त्रुटि संदेश मिलता है: main.cpp | 3 | त्रुटि: 'str ऑपरेटर "" _X (डबल)' अमान्य तर्क सूची है

समस्या क्या है? क्या यह कुछ करने के लिए है "अंतर्निहित शाब्दिक प्रत्यय के अर्थ को फिर से परिभाषित करना संभव नहीं है" (स्ट्राउस्ट्रप एफएक्यू)? क्या आप एक कामकाज के बारे में सोच सकते हैं?

उत्तर

31

What is the problem?

समस्या यह है कि मानक इसे मना करता है। प्रति उपयोगकर्ता परिभाषित शाब्दिक पर सी ++ 11 स्टैंडर्ड के पैरा 13.5.8./3:

The declaration of a literal operator shall have a parameter-declaration-clause equivalent to one of the following:

const char* 
unsigned long long int 
long double 
char 
wchar_t 
char16_t 
char32_t 
const char*, std::size_t 
const wchar_t*, std::size_t 
const char16_t*, std::size_t 
const char32_t*, std::size_t 

एक समाधान के संबंध में, मैं नहीं यकीन है कि यह जरूरत है, के बाद से निम्नलिखित ठीक काम करता है हूँ (एक double परोक्ष हो जाता है एक long double में बदल जाती है, तो आप प्रकार double का शाब्दिक) में पारित कर सकते हैं:

struct str {}; 

str operator"" _X(long double d) { 
    return str(); 
} 

int main() 
{ 
    str s = 4.0_X; 
} 
+3

ठीक धन्यवाद लिख सकते हैं:

क्या उपयोगी हो सकता है इस तरह तैयार है। पर क्यों ? मेरा मतलब है, सिंटैक्स में कुछ ऐसा था जो डबल में असमर्थ था? –

+5

@ बेरेन्गरबर्थोल: आप 'डबल' का उपयोग क्यों करेंगे जब 'लंबी डबल' में अधिक या अधिक रेंज और सटीकता हो? शायद गति या स्मृति उपयोग के कारणों के लिए, सही? खैर, वे संकलन समय पर किए गए संचालन के लिए विचार नहीं हैं। यदि आप डबल परिशुद्धता के साथ संचालन करना चाहते हैं, तो आप हमेशा फ़ंक्शन के अंदर एक कास्ट का उपयोग कर सकते हैं। –

+0

@ बेन वोगेट ठीक है, मेरे लिए ठीक है। मुझे लगता है कि यह थोड़ा सा झुकाव है, लेकिन वास्तव में कोई बड़ा पीबी नहीं है। धन्यवाद –

3

मुझे लगता है कि यह अस्पष्ट भार के को रोकने के लिए है। क्या होगा यदि आप निम्नलिखित अधिभार को परिभाषित करने की अनुमति दी गई

str operator"" _X(long double ld); 
str operator"" _X(double d); 
str operator"" _X(float f); 

सेट आप स्रोत कोड में उपयोगकर्ता परिभाषित शाब्दिक है कि ऊपर से प्रत्येक के लिए नक्शे होगा का उदाहरण दे सकते हैं? नहीं, शाब्दिक को एक विशेष फ़्लोटिंग-पॉइंट डेटाटाइप को बाधित करने का कोई तरीका नहीं है।

str operator"" l_X(long double ld); 
str operator"" _X(long double d); 
str operator"" f_X(long double f); 

अब जब से तुम

3.0_X // treated like a double 
3.0l_X // treated like a long double 
3.0f_X // treated like a float 
+0

यह संभव है, लेकिन मैं नहीं करता ऐसा सोचता। यदि आप एक ही समय में लाभ प्राप्त कर सकते हैं तो यह पैर में खुद को शूटिंग करने में सक्षम होने के लिए सी ++ दर्शन के खिलाफ जाएगा। और वास्तव में इसका लाभ होगा। उदाहरण के लिए, मेरे असली कोड में, संरचना "str" ​​टेम्पलेट है, और विशेष रूप से "डबल" के लिए तत्काल। और इसके लिए मैं "लंबी डबल" चाल का उपयोग नहीं कर सकता (विशेषज्ञता के अलावा, लेकिन यह वास्तव में kludgy बन रहा है, और उदा।कार्यों के लिए आंशिक विशेषज्ञता की अनुमति नहीं है ...) –

+1

@ बेरेंगेरथथौल: अपने ऑपरेटर को 'str ऑपरेटर "" _X (लंबी डबल एलडी) {डबल डी = एलडी;/* डी * /} का उपयोग करें –

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