मैं कुछ 'पोर्टेबल' कोड लिख रहा हूँ (अर्थात यह लक्षित करता है कि 32- और 64-बिट MSVC2k10 और जीसीसी लिनक्स पर) जिसमें मैं है, और अधिक या कम:वैश्विक टाइपकास्ट ऑपरेटर अधिभार?
typedef unsigned char uint8;
सी-तार हमेशा uint8 हैं ; यह स्ट्रिंग प्रसंस्करण कारणों के लिए है। लीगेसी कोड को हस्ताक्षरित के रूप में संकलित चार की आवश्यकता होती है, इसलिए मैं इसे हस्ताक्षरित करने के लिए डिफ़ॉल्ट रूप से कंपाइलर स्विच सेट नहीं कर सकता। लेकिन मैं एक स्ट्रिंग मैं सूचकांक एक सरणी प्रसंस्करण कर रहा हूँ नहीं तो बहुत अच्छी तरह से:
char foo[500];
char *ptr = (foo + 4);
*ptr = some_array_that_normalizes_it[*ptr];
आप कर सकते हैं नहीं सूचकांक गंभीर परिणाम के बिना रन-टाइम में एक नकारात्मक संख्या के साथ एक सरणी। सी-स्ट्रिंग को हस्ताक्षरित रखने से बग से ऐसी आसान सुरक्षा की अनुमति मिलती है।
मैं वास्तव में कास्टिंग (char *) रखना चाहता हूं, हर बार जब मैं एक फ़ंक्शन का उपयोग करता हूं जो char * लेता है, और क्लास फ़ंक्शंस को डुप्लिकेट करना भी रोकता है ताकि वे या तो ले सकें। यह विशेष रूप से एक दर्द है क्योंकि एक स्ट्रिंग लगातार परोक्ष एक चार *
int foo = strlen("Hello"); // "Hello" is passed as a char *
मैं काम करने के लिए इन सब चाहते हैं के रूप में पारित हो जाता है: इस प्रकार की अंतर्निहित प्रकार रूपांतरण की अनुमति
char foo[500] = "Hello!"; // Works
uint8 foo2[500] = "Hello!"; // Works
uint32 len = strlen(foo); // Works
uint32 len2 = strlen(foo2); // Doesn't work
uint32 len3 = strlen((char *)foo2); // Works
संभवतः चेतावनियां कर रहे हैं हालांकि, यह उन कार्यों का उपयोग करना अच्छा लगेगा जो हर बार एक कलाकार के बिना एक char * लेते हैं।
तो, मैं समझ कुछ इस तरह काम करेगा:
operator char* (const uint8* foo) { return (char *)foo; }
हालांकि ऐसा नहीं है। मैं इसे काम करने के लिए किसी भी तरह से पता नहीं लगा सकता। मुझे यह बताने के लिए कुछ भी नहीं मिला कि ऐसा करने का कोई तरीका क्यों नहीं है। मैं संभावित तर्क देख सकता हूं - इस तरह के निहित रूपांतरण एफएआर का बहुत कारण हो सकता है - लेकिन मुझे कुछ भी नहीं मिल रहा है जो कहता है "यह सी ++ में काम नहीं करेगा" या क्यों, या इसे कैसे काम करना है (छोटा uin8 को एक वर्ग जो हास्यास्पद बनाता है)।
आप उन कलाकारों (या ऑपरेटरों) को नहीं लिख सकते हैं जिनमें कम से कम एक उपयोगकर्ता परिभाषित प्रकार शामिल नहीं है –
आपके पास विरासत कोड है जो 'हस्ताक्षरित char' का उपयोग करता है ?? मुझे बहुत संदेह है कि ... –
यूंट 8 को हास्यास्पद क्यों बना रहा है? यह भयानक वैश्विक कास्टिंग कार्यों का एक गुच्छा होने से कहीं अधिक हास्यास्पद नहीं है। – ThomasMcLeod