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 प्राप्त करने के लिए उपलब्ध नहीं है स्ट्रिंग अक्षर से डी।
- क्या वास्तव में यह मामला है कि स्ट्रिंग अक्षर को भिन्न टेम्पलेट फॉर्म का उपयोग करके हल नहीं किया जा सकता है?
- यदि हां, तो क्या किसी के पास कोई अंतर्दृष्टि है कि यूडीएल का इतना उपयोगी रूप मानक से क्यों छोड़ा गया था?
प्रत्येक शाब्दिक, प्रकारों के लिए एक नया प्रकार बनाने के बारे में वास्तव में क्या उपयोगी है जो एक दूसरे से पूरी तरह से अलग होगा? –
@ निकोलबोलस: दिखाए गए उदाहरणों में, आप * अलग-अलग प्रकार के अलग-अलग अक्षर चाहते हैं। इसके अलावा, एक शाब्दिक का अंतिम प्रकार अपने पात्रों का एक भरोसेमंद संयोजन नहीं होना चाहिए। उदाहरण के लिए, 'freq:% g hz "world" _fmt (44000)' मेटाप्रोग्रामिंग के माध्यम से 'फ़ॉर्मेटर (" freq: "," hz ") (44000) 'जैसे कुछ को हल कर सकता है। –
इसका भी अर्थ होगा कि आप * इसे किसी ऐसे नंबर को पास नहीं कर सकते जो कि संख्या नहीं है। इसलिए आप इसे कुछ पास नहीं कर पाएंगे जो कि स्ट्रीम में कनवर्ट करने के लिए 'ऑपरेटर <<' का उपयोग कर सकता है, इस प्रकार डेटा प्रकारों को अनुकूलित करने की संभावना को हटा सकता है। –