2012-06-04 14 views
10

C++ नई उपयोगकर्ता परिभाषित शाब्दिक अवधारणा जैसे स्ट्रिंग-शाब्दिक से कुछ बहुत ही दिलचस्प उपयोग करता है, पता चलता है:क्या स्ट्रिंग-आधारित उपयोगकर्ता-परिभाषित अक्षर दृढ़ता से टाइप किए जा सकते हैं?

template <char... Chars> Name<Chars...> operator "" _name() { 
    return Name<Chars...>(); 
} 

auto a = 123_name; // OK 
auto b = "abc"_name; // Error 
:

"Goodbye %s world"_fmt("cruel"); 
"Goodbye %s world"_fmt(123); // Error: arg 1 must be convertible to const char* 

R"(point = \((\d+), (\d+)\))"_re; // Builds DFA at compile-time. 

typedef table< 
    column<"CustId"_name , std::string>, 
    column<"FirstName"_name, std::string>, 
    column<"LastName"_name , std::string>, 
    column<"DOB"_name  , date  > 
> Customer; 
हालांकि

, जब मैं जीसीसी में निर्माणों, जैसे इस प्रकार के निर्माण

मैं निम्नलिखित त्रुटि मिलती है: चारों ओर पढ़ने से

…unable to find string literal operator ‘operator"" _name’ with ‘const char [4]’, ‘long unsigned int’ arguments 

, मेरा अनुमान है कि कि variadic-टेम्पलेट प्रपत्र UDLs प्राप्त करने के लिए उपलब्ध नहीं है स्ट्रिंग अक्षर से डी।

  1. क्या वास्तव में यह मामला है कि स्ट्रिंग अक्षर को भिन्न टेम्पलेट फॉर्म का उपयोग करके हल नहीं किया जा सकता है?
  2. यदि हां, तो क्या किसी के पास कोई अंतर्दृष्टि है कि यूडीएल का इतना उपयोगी रूप मानक से क्यों छोड़ा गया था?
+0

प्रत्येक शाब्दिक, प्रकारों के लिए एक नया प्रकार बनाने के बारे में वास्तव में क्या उपयोगी है जो एक दूसरे से पूरी तरह से अलग होगा? –

+0

@ निकोलबोलस: दिखाए गए उदाहरणों में, आप * अलग-अलग प्रकार के अलग-अलग अक्षर चाहते हैं। इसके अलावा, एक शाब्दिक का अंतिम प्रकार अपने पात्रों का एक भरोसेमंद संयोजन नहीं होना चाहिए। उदाहरण के लिए, 'freq:% g hz "world" _fmt (44000)' मेटाप्रोग्रामिंग के माध्यम से 'फ़ॉर्मेटर (" freq: "," hz ") (44000) 'जैसे कुछ को हल कर सकता है। –

+0

इसका भी अर्थ होगा कि आप * इसे किसी ऐसे नंबर को पास नहीं कर सकते जो कि संख्या नहीं है। इसलिए आप इसे कुछ पास नहीं कर पाएंगे जो कि स्ट्रीम में कनवर्ट करने के लिए 'ऑपरेटर <<' का उपयोग कर सकता है, इस प्रकार डेटा प्रकारों को अनुकूलित करने की संभावना को हटा सकता है। –

उत्तर

8

आप सही हैं। स्ट्रिंग शाब्दिक variadic टेम्पलेट प्रपत्र (§2.14.8/5) के साथ नहीं किया जा सकता:

If L is a user-defined-string-literal, let str be the literal without its ud-suffix and let len be the number of code units in str (i.e., its length excluding the terminating null character). The literal L is treated as a call of the form

operator "" X (str, len) 

मैं प्रस्ताव के कागजात (जिनमें से नवीनतम मैं N2750 था मिल सकता है) के माध्यम से फेरबदल कर दिया है और एक विवरण नहीं मिल सका विविध टेम्पलेट फॉर्म के उपयोग की अनुमति नहीं है।

+0

कहलाएगा जैसा कि यह छोटा हो सकता है दो सुविधाओं का समवर्ती विकास जो किसी को दूसरे का उपयोग करने से रोका? –

+0

@Matthieu एम मुझे ऐसा नहीं लगता। मुझे अलग-अलग विकसित होने के साक्ष्य नहीं मिल रहे हैं (वे हमेशा एक ही पेपर में एक साथ रहते हैं)। ईमानदार होने के लिए, जब मैंने विविधतापूर्ण रूप को देखा तो पहली बात जो दिमाग में आई थी, वह जवाब में ओपी दिखाता था। मैं मानना ​​चाहता हूं कि समिति ने इसमें कुछ संभावित समस्या देखी है। या तो वह या एक बहुत ही परेशान निरीक्षण। –

+3

सभी उपयोगकर्ता परिभाषित अक्षर हैं जो विविधता के उपयोग की अनुमति देते हैं, मूल स्रोत वर्ण सेट तक सीमित हैं (केवल इसलिए कि व्याकरण इनट्स या फ्लोट्स में किसी और चीज की अनुमति नहीं देता है)। स्ट्रिंग अक्षर में उस सीमा नहीं है, इसलिए मल्टीबाइट स्रोत/निष्पादन एन्कोडिंग के साथ आपके पास स्ट्रिंग अक्षर में सी-वर्ण हैं जो अलग-अलग वर्णों के रूप में प्रतिनिधित्व नहीं कर सकते हैं। उस निर्णय के साथ कुछ करने के लिए हो सकता है कि स्ट्रिंग अक्षर के साथ वैरिएडिक फॉर्म को अनुमति न दें। – bames53

2

N3599, जो इसे अनुमति देता है, को जीसीसी और क्लैंग में लागू किया गया है।

template<class CharT, CharT... chars> 
int operator ""_suffix(){ 
    return 42; 
} 
संबंधित मुद्दे