2011-12-21 21 views
6

मैं कुछ 'पोर्टेबल' कोड लिख रहा हूँ (अर्थात यह लक्षित करता है कि 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 को एक वर्ग जो हास्यास्पद बनाता है)।

+3

आप उन कलाकारों (या ऑपरेटरों) को नहीं लिख सकते हैं जिनमें कम से कम एक उपयोगकर्ता परिभाषित प्रकार शामिल नहीं है –

+0

आपके पास विरासत कोड है जो 'हस्ताक्षरित char' का उपयोग करता है ?? मुझे बहुत संदेह है कि ... –

+2

यूंट 8 को हास्यास्पद क्यों बना रहा है? यह भयानक वैश्विक कास्टिंग कार्यों का एक गुच्छा होने से कहीं अधिक हास्यास्पद नहीं है। – ThomasMcLeod

उत्तर

1

मैं ऑपरेटर [ab] का उपयोग करने वाला बड़ा प्रशंसक नहीं हूं, लेकिन क्या सी ++ सही है?

आप क्या कर सकते हैं निम्नलिखित:

const char* operator+(const uint8* foo) 
{ 
    return (const char *)foo; 
} 

char* operator+(uint8* foo) 
{ 
    return (char *)foo; 
} 
परिभाषित उन के साथ

, अपने उदाहरण से:

uint32 len2 = strlen(foo2); 

बन जाएगा

uint32 len2 = strlen(+foo2); 

यह एक स्वत: डाली नहीं है, लेकिन इस तरह आपके पास ऐसा करने का एक आसान, अभी तक स्पष्ट तरीका है।

+0

धन्यवाद, अच्छा विचार! –

+0

वाह ............ –

0

आपके द्वारा बताए गए दोनों कंपाइलर्स में "इलाज के रूप में वर्णित वर्ण" स्विच होते हैं। इसका उपयोग क्यों नहीं करें?

+0

ब्रेकिंग विरासत कोड। जैसे मैंने कहा ... दूसरी वाक्य। –

+0

ओह ... मैं आपके कार्यक्रम की प्रकृति के बारे में निश्चित नहीं हूं। मैंने सोचा कि आप कुछ नया लिख ​​रहे थे! (जैसे आपने पहली वाक्य में कहा था) –

3

वैश्विक कलाकारों (समान किरदार) ऑपरेटर, वैश्विक असाइनमेंट ऑपरेटर, वैश्विक सरणी सबस्क्रिप्ट ऑपरेटर और वैश्विक समारोह कॉल ऑपरेटर ओवरलोडिंग C++ अनुमति नहीं है।

एमएसवीएस सी ++ उन पर C2801 errors उत्पन्न होगा। C12+ ऑपरेटरों की सूची के लिए Look at wiki और उन्हें ओवरलोडिंग नियम।

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