2012-03-13 12 views
5
const char* s1 = "teststirg"; 
const char s2[] = "teststirg"; 

मुझे एक विधि चाहिए कि मुझे यह बताएं कि एस 1 "char *" है और एस 2 "char []" है, विधि को कैसे लिखना है?कोड में कॉन्स्ट char * और const char [] के प्रकार की पहचान कैसे करें?

+1

क्या आप एक ऐसा फ़ंक्शन चाहते हैं जो char * लेता है लेकिन आपको बता सकता है कि इसे मूल रूप से कैसे घोषित किया गया था? मुझे नहीं लगता कि ऐसा करने के लिए एक पोर्टेबल तरीका है। –

+0

हाँ, मूल रूप से प्राप्त करने के लिए कोई पोर्टेबल तरीका नहीं है। सहज ज्ञान प्राप्त करने के लिए बस एक छोटी सी चाल है। – zsounder

उत्तर

6

उपयोग टेम्पलेट्स:

template<typename T, unsigned int SIZE> 
bool IsArray (T (&a)[SIZE]) { return true; } 

template<typename T> 
bool IsArray (T *p) { return false; } 

इस क्रम में मूल्यांकन करेंगे।
उपयोग:

if(IsArray(s1)) 
... 

if(IsArray(s2)) 
... 

हैं रुचि रखते हैं, तो आप कुछ अग्रिम तकनीक, जो आप इस रूप में संकलन समय बताएगा उपयोग कर सकते हैं।

संपादित:

typedef char (&yes)[2]; 

template<typename T, unsigned int SIZE> 
yes IsArray (T (&a)[SIZE]); 

template<typename T> 
char IsArray (T *p); 

उपयोग:

if(sizeof(IsArray(s1)) == sizeof(yes)) 
... 
if(sizeof(IsArray(s2)) == sizeof(yes)) 
... 
+1

क्या यह संभव नहीं है कि पहला संस्करण इनलाइन और कॉन्स-प्रोपेगेटेड होगा ताकि संकलन-समय बनाम रन-टाइम वैसे भी समाप्त हो जाए? आउटपुट बाइनरी में है। – KillianDS

+0

@ किलियनडीएस, इस विशेष मामले के लिए आप सही हैं। लेकिन पहला संस्करण 'टेम्पलेट' तर्कों के हिस्से के रूप में उपयोग नहीं किया जा सकता है क्योंकि इसका संकलन स्थिर नहीं होता है। सी ++ 11 'constexpr' के साथ हो सकता है, हम संकलन समय निरंतर के रूप में भी 1 संस्करण का उपयोग करने में सक्षम हो सकता है। – iammilind

+1

@ किलियनडीएस: हां, हालांकि जब तक 'constexpr' चिह्नित नहीं किया गया पहला संस्करण मेटा टेम्पलेट प्रोग्रामिंग के लिए उपयोग नहीं किया जा सकता है। –

0

आप मूल परिभाषा के लिए उपयोग किया है, तो typeid इस्तेमाल किया जा सकता है (लेकिन क्या, मुझे पता नहीं है)। यदि आपके पास मूल परिभाषा तक पहुंच नहीं है ... तो char* को char*, या किसी सरणी से प्रारंभ किया गया था, यह जानने का कोई तरीका नहीं है। जबकि चरण 3 कामयाब होने की

0

उपरोक्त संदर्भ (है कि एक ही तरीका है, जहां हम घोषणा की है में है) में,

/*1*/ s1[0]='\0'; 
    /*2*/ s2=s1; 
    /*3 Only This is valid*/ s1=s2; 
    /*4*/ s2[0]='\0'; 

आपका संकलक, कदम 1,2,4 पारित करने के लिए अनुमति नहीं होगी। यह स्पष्ट रूप से चर की प्रकृति को इंगित करता है। अब, यह निर्धारित करने के लिए विधि (फ़ंक्शन कॉल) के संबंध में, आपको विधि हस्ताक्षर में परिभाषा भी होनी चाहिए, इसलिए मुझे इस विधि का कोई उद्देश्य/उपयोगिता/संभावना नहीं दिखाई दे रही है।

determiner (const char* s1,const char *const s2) 

आप पहले से ही signature.You में परिभाषा संकलक बायपास करने के लिए, इस के लिए एक उपयोग के मामले प्राप्त करने की आवश्यकता है। मैं क्षमा चाहता हूं, अगर मुझे आपकी आवश्यकता सही नहीं मिली है।