2012-01-05 10 views
5

सी ++ 11 में दो नए चरित्र अभिन्न डेटा प्रकार, char16_t और char32_t हैं। मैं उन्हें उन कंपाइलरों के लिए अनुकरण करना चाहता हूं जिनके पास I/O संचालन को अधिभारित करने के लिए एक अलग प्रकार नहीं है ताकि उन्हें उनके पूर्णांक मूल्य के बजाय वर्ण दिखाई दे सकें।पूरी तरह से गायब विशिष्ट बिल्टिन प्रकारों (विशेष रूप से: char16_t और char32_t)

ये आवश्यकताएँ हैं:

  • अलग (कोई typedef)।
  • सामान्य सिस्टम (आला uint16_t और uint32_t)
  • अन्य सी ++ 11 विशेषताएं (पहला प्रयास नीचे देखें)
  • शाब्दिक साथ अच्छा खेलने अवश्य अनुमति दी जाती है पर सटीक-चौड़ाई; char16_t c16 = u"blabla unicode text blabla"; काम करना चाहिए।
  • यदि गणित ऑपरेटरों में char16_t का उपयोग किया जा सकता है, तो जाहिर है कि इसे भी कार्य करने की आवश्यकता है।

मेरा पहला प्रयास है जो शाब्दिक विभाग में विफल रहता है एक जोरदार टाइप किया enum था:

enum char16_t : uint16_t; 

यह रूप में अच्छी तरह अन्य कमियां हैं, कि शायद (जो वास्तव में है आवश्यक ऑपरेटरों अपने आप आपूर्ति द्वारा हल किया जा सकता है मेरी ओर से मंजूरी है)।

+0

यह पूरी तरह अस्पष्ट है कि आप इसका प्रयास क्यों कर रहे हैं या आप किस टूल्स का उपयोग करना चाहते हैं। "पहला प्रयास" सी ++ 11 का उपयोग करता है। बिना किसी गारंटीकृत यूनिकोड समर्थन वाले एक कंपाइलर से यूनिकोड अक्षर प्राप्त करने का कोई तरीका नहीं है, और हाल ही में C++ 11 कंपाइलर, अवधि के बिना संकलन समय पर स्ट्रिंग में हेरफेर करने का कोई तरीका नहीं है। – Potatoswatter

उत्तर

1

मुझे नहीं लगता कि आपको काम शुरू करने के लिए प्रारंभिकता मिल जाएगी क्योंकि इसे काम करने के लिए बहुत अधिक गुंजाइश नहीं है। समस्या यह है कि प्रारंभ आप अपने उदाहरण में उपयोग कर रहे हैं काम करने वाला नहीं है: स्ट्रिंग शाब्दिक u"..." एक char16_t const ऑब्जेक्ट की श्रृंखला पैदावार और आप इसके साथ एक सूचक को प्रारंभ करना चाहते हैं: इसके अलावा

char16_t const* c16 = u"..."; 

, बिना कंपाइलर में char16_t का कार्यान्वयन char16_t स्ट्रिंग अक्षर का समर्थन करने की बहुत संभावना नहीं है। सबसे अच्छा आप हासिल कर सकते हैं मैक्रो ट्रिक्स खेलने के लिए जो सही चीज करने के इरादे से हैं। अभी के लिए, आप उदाहरण का उपयोग करेंगे विस्तृत चरित्र अक्षर और जब आप एक संकलक प्राप्त करते हैं जो char16_t का समर्थन करता है तो आप char16_t अक्षरों का उपयोग करने के लिए बस मैक्रो बदलते हैं। यहां तक ​​कि काम करने के लिए आपको रिकॉर्ड प्रकार का उपयोग करने की आवश्यकता हो सकती है जो कि 16 बिट से बड़ा है क्योंकि wchar_t कुछ प्लेटफ़ॉर्म पर 32 बिट्स का उपयोग करता है।

#define CONCAT(a,b) a##b 

#if defined(HAS_C16) 
# define C16S(s) CONCAT(u,s) 
#else 
# define C16S(s) reinterpret_cast<char16_t const*>(CONCAT(L,s)); 
struct char16_t 
{ 
    unsigned short value; 
}; 
#endif 


int main() 
{ 
    char16_t const* c16 = C16S("..."); 
} 

जाहिर है, आपको अभी भी सभी प्रकार के ऑपरेटरों को प्रदान करने की आवश्यकता है उदा। पूर्णांक अंकगणित और उपयुक्त रूपांतरण काम करने के लिए।

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