2016-03-03 3 views
18

सी की घोषणा ++ स्ट्रिंग is the following:क्या मूल_स्ट्रिंग <T> के लिए कोई उपयोग है जहां टी चरित्र प्रकार नहीं है?

template< 
    class CharT, 
    class Traits = std::char_traits<CharT>, 
    class Allocator = std::allocator<CharT> 
> class basic_string; 

CharT चरित्र प्रकार है जो char, wchar_t, char16_t और char32_t हो सकता है; लेकिन सभी basic_string के बाद एक टेम्पलेट है, इसलिए अन्य CharT और अन्य आवंटकों के साथ तत्काल किया जा सकता है। मैं अन्य allocators मैं अन्य डेटा प्रकार के तार के लिए उपयोग के मामलों में लगता है कि करने में असमर्थ हूँ, उदाहरण के लिए के लिए कुछ उपयोग के मामलों में लगता है सकते हैं:

using string = std::basic_string<int>; 

पूर्णांकों की एक स्ट्रिंग का उपयोग करना, हम इसे एक स्ट्रिंग के रूप में प्रारंभ नहीं कर सकते हैं (स्पष्ट) न ही यू 32 स्ट्रिंग (यह स्पष्ट नहीं है, कम से कम मेरे लिए); लेकिन हम int के रूप में लंबे समय के रूप में सूची का निहित प्रकार परिवर्तनीय है initializer_list के साथ प्रारंभ कर सकते हैं:

string err1("test"); // Error! 
string err2(U"test"); // Error! 
string err3{"test"}; // Error! 
string err4{U"test"}; // Error! 
string err5 = "test"; // Error! 
string err6 = U"test"; // Error! 

string success1({U't', U'e', U's', U't'}); 
string success2 = {U't', U'e', U's', U't'}; 
string success3({'t', 'e', 's', 't'}); 
string success4 = {'t', 'e', 's', 't'}; 

लेकिन फिर भी अगर हम एक पूर्णांक स्ट्रिंग प्रारंभ करने का प्रबंधन है, हम इसे सामान्य तरीके से उपयोग नहीं कर सकते:

std::cout << success1; // Error! expected 116101115116 

केवल basic_stringcout साथ प्रयोग किया जा करने की उम्मीद सामान्य होते हैं, कि समझ में आता है: सब के बाद हम कल्पना नहीं कर सकते कि कैसे पूर्णांकों का एक स्ट्रिंग या MyFancyClass तों की एक स्ट्रिंग मुद्रित करने के लिए माना जाता है।

लेकिन वैसे भी, का निर्माण अजीबbasic_string के उदाहरणों को प्रतिबंधित नहीं किया गया है; अंतर्निहित प्रकार को सीमित किए बिना basic_string पर उपयोग किए जाने वाले सुविधाओं की कमी के कारण एक हाथ पर वर्जित नहीं किया गया है (अवधारणाओं के बिना) और यह मुझे आश्चर्यचकित करता है :

  • क्या std::basic_string<T> के लिए कोई उपयोग है जहां T कोई वर्ण प्रकार नहीं है?

के रूप में किसी भी उपयोग मैं चीजें हैं जो केवल दूसरे शब्दों में T के तार के साथ प्राप्त किया जा सकता है और उस T के वेक्टर के साथ नहीं किया जा सकता है (या यह करने के लिए काफी कठिन होगा), के बारे में सोच रहा हूँ :

  • क्या आपने कभी ऐसी स्थिति का सामना किया है जहां T की एक स्ट्रिंग बेहतर विकल्प है?
+0

क्या आप ऐसा कुछ सोच सकते हैं जो एक स्ट्रिंग वेक्टर से बेहतर कर सकती है? – NathanOliver

+0

@NathanOliver प्रिंटिंग? – BoBTFish

+0

क्या यह लगभग एक ही सवाल नहीं है "आप' std :: basic_string 'के साथ क्या कर सकते हैं कि आप 'std :: vector '? "के साथ नहीं कर सकते – user463035818

उत्तर

2

जब टोकननाइज़र बनाना, char [n] या enum दिमाग में आता है। ध्यान दें कि टोकन का कन्स्ट्रक्टर मूल_स्ट्रिंग द्वारा नहीं चलाया जाता है।

#include <iostream> 
#include <string> 
#include <string.h> 

static const int max_token_length = 10; 

struct Token 
{ 
    char str[max_token_length]; 
}; 

// define std::char_traits<Token> if your implementation defaults are not fine for you (or don't exist as it's not required) 

int main() { 
    Token t; 
    strncpy(t.str, "for", max_token_length); 
    std::basic_string<Token> s1(1, t); 

    Token u; 
    strncpy(t.str, "for", max_token_length); 
    std::basic_string<Token> s2(1, u); 

    std::basic_string<Token> s = s1 + s2; 

    return 0; 
} 
+2

"कन्स्ट्रक्टर रन नहीं है" का क्या मतलब है? निश्चित रूप से यह है! इस पंक्ति में: 'std :: basic_string s;', डिफ़ॉल्ट कन्स्ट्रक्टर। वैसे, [मेरी याददाश्त और इस साइट के अनुसार] (http://en.cppreference.com/w/cpp/string/basic_string/basic_string) basic_string डिफ़ॉल्ट कन्स्ट्रक्टर इसे खाली उदाहरण के रूप में प्रारंभ करता है (शून्य-लंबाई स्ट्रिंग, ** अनिर्दिष्ट क्षमता **)। इसका मतलब है कि एस [0] ** ** अभी तक अस्तित्व में नहीं है, जब तक कि आप इसे ठीक से सेट न करें। – quetzalcoatl

+0

हालांकि, इसके अलावा, "टोकनेज़र" उदाहरण प्रश्न का एक अच्छा जवाब है। अब आप तार-से-टोकन पर स्ट्रिंग-ऑप्स (कॉन्सटेनेट/सबस्ट्रिंग/आदि) कर सकते हैं ... लेकिन क्या यह वास्तव में अधिक उपयोगी है कि अन्य कंटेनर होंगे? मुझे वास्तव में संदेह है। – quetzalcoatl

+1

@quetzalcoatl: टोकन का कन्स्ट्रक्टर नहीं चलाया जाता है (केवल असाइनमेंट निष्पादित किया जाता है), basic_string का कन्स्ट्रक्टर निश्चित रूप से निष्पादित किया जाता है। इसे स्पष्ट करने के लिए संपादन। आप इसे सत्यापित कर सकते हैं: यदि आप एक प्रकार जोड़ते हैं जहां कन्स्ट्रक्टर से पहले असाइनमेंट अमान्य है, तो यह आमतौर पर विफल रहता है। यह है (कारणों में से एक) क्यों हम std :: basic_string > नहीं हो सकते हैं। – lorro

1

आप एक प्रणाली है कि एक से अधिक पाठ एन्कोडिंग (जैसे ASCII और EBCDIC) संभालती के साथ काम कर रहे हैं, तो आपको एक अलग चरित्र के प्रकार और प्रत्येक एन्कोडिंग के लिए स्ट्रिंग प्रकार चाहते हो सकता है। उन्हें दोनों तारों के रूप में माना जाना चाहिए, लेकिन स्पष्ट रूप से अलग प्रकार हैं।

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