2011-03-31 5 views
16

एक स्ट्रेलन और एक wcslen फ़ंक्शन है, लेकिन क्या एक टेम्पलेटेड वर्ण सरणी लंबाई फ़ंक्शन है ताकि आप strlen<char> या strlen<wchar_t> जैसे कुछ कर सकें?एक स्ट्रेलन है, और एक wcslen है, लेकिन क्या एक टेम्पलेट फ़ंक्शन है जैसे strlen <char> या strlen <wchar_t>?

यदि नहीं, तो मुझे लगता है कि मैं अपना खुद का लिखूंगा।

+0

वेक्टर .size()? – Joe

+0

यदि आप विंडोज के तहत काम कर रहे हैं, तो बहुत सारे _tcs * फ़ंक्शंस हैं, लेकिन यह कुछ अलग है (और 2011 में आपको अभी भी विंडोज़ में Ansi charset के लिए प्रोग्राम नहीं करना चाहिए) – xanatos

+1

क्या कोई कारण है कि आप सिर्फ इतना नहीं इसके लिए अपना खुद का अस्पष्ट अधिभार लिखें? – dcousens

उत्तर

21

आपके पास std :: string द्वारा उपयोग किए गए char_traits सहायक हैं।

यह char_traits<char>::length और char_traits<wchar_t>::length प्रदान करता है।

4

यदि आप टेम्पलेट का उपयोग कर रहे थे तो क्या आप std :: string (जो निश्चित रूप से templated है) का उपयोग नहीं कर रहे हैं?

+1

मेरे प्रश्न का उत्तर देने के लिए धन्यवाद। नहीं, यह एक basic_ofstream पर लिखने के लिए है और एक व्यक्ति को एक वर्ण सरणी बफर में जाने की अनुमति देता है। – leetNightshade

+1

@leetNightshade - यही कारण है कि एक सामान्य templated सी स्ट्रिंग std लाइब्रेरी नहीं है, लेकिन अपने खुद के –

+1

लिखने के लिए स्वतंत्र महसूस करें, उस स्थिति में, आपको विशेषता वर्ग में संबंधित फ़ंक्शन का उपयोग करने की आवश्यकता है (मुझे लगता है)। –

1
template <class T> size_t strlen(T * _arg) 
{ 
    if (_arg == 0) 
    return -1; 
    size_t i = 0; 
    while (_arg[i] != 0) ++i; 
    return i; 
} 
+2

क्या आप मानक संस्करण को कॉल करने के लिए टेम्पलेट विशेषज्ञता का उपयोग नहीं करना चाहते हैं, जिसे विशेष रूप से अनुकूलित किया जा सकता है (लगभग बहु-शब्द प्रस्तुतिकरणों के बारे में क्या भूल गया है, क्या आप सुनिश्चित हैं कि समापन चरित्र हमेशा wchar_t पर '\ 0' है (यानी यह हो सकता है एक तिहाई के बीच)? (मैं नहीं हूँ))। –

+0

@ मार्टिन: यदि आप किसी भी कारण से अपनी स्ट्रिंग को 'वेक्टर' में संग्रहीत करते हैं, तो आपको इस फ़ंक्शन की आवश्यकता हो सकती है। बेशक 'खोज' भी अच्छा हो सकता है। – Naszta

0

सरल जवाब है, std :: लगता है हो सकता है एक विशेष अंत इटरेटर कि कुछ भी मेल खाता है कभी नहीं के साथ। कर रहे हैं सी (नहीं सी ++) का हिस्सा (एक टेम्पलेट में, आप टी()। के लिए देख रहे)

0

सं

इसका कारण यह है strlen है() और wcslen() और इस तरह सी-तार संभाल।

सी ++ std :: string (std :: wstring) प्रदान करके सी-स्ट्रिंग्स के उपयोग को हतोत्साहित करता है। ये निश्चित रूप से टेम्पलेट्स हैं (std :: basic_string < टी >)।

अपनी खुद की लिखने के बजाय सी ++ std :: स्ट्रिंग में स्थानांतरित करना बेहतर नहीं होगा?

+0

फिर से, इसका उपयोग IWriteFile के अंदर किया जा रहा है जो आपको मूल_स्ट्रिंग , एक CharType *, या आकार के साथ एक शून्य * लिखने की अनुमति देता है। तो अगर मैं बफर से स्ट्रिंग बनाने में समय बिताना नहीं चाहता तो मुझे दूसरे विकल्प के लिए इसकी आवश्यकता है। उदाहरण के लिए, बफर को नेटवर्क कनेक्शन से बनाया जा सकता था। – leetNightshade

0

वैसे स्पष्ट तरीका यह है कि आपका फ़ंक्शन basic_string<CharType> ले लें और उपयोगकर्ता को उनमें से एक बनाएं। फिर मानक पुस्तकालय में सभी लंबाई सामान छिपा हुआ है।

यदि यह उपयुक्त नहीं है, तो केवल चरित्र गणना के चलते ट्रैक को रखें क्योंकि आप उन्हें स्ट्रीम के आंतरिक बफर में कॉपी कर रहे हैं।

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