2017-01-09 8 views
20

मैंने कोड लिखने के लिए http://en.cppreference.com/w/cpp/language/typeid को संदर्भित किया है जो विभिन्न प्रकार के लिए अलग-अलग चीजें करता है।तर्क में चर बनाम स्ट्रिंग के लिए std :: स्ट्रिंग का आईडी टाइप करें?

कोड नीचे जैसा है और टिप्पणियों में स्पष्टीकरण दिया गया है।

#include <iostream> 
#include <typeinfo> 

using namespace std; 

template <typename T> 
void test_template(const T &t) 
{ 
    if (typeid(t) == typeid(double)) 
     cout <<"double\n"; 
    if (typeid(t) == typeid(string)) 
     cout <<"string\n"; 
    if (typeid(t) == typeid(int)) 
     cout <<"int\n"; 
} 

int main() 
{ 
    auto a = -1; 
    string str = "ok"; 
    test_template(a); // Prints int 
    test_template("Helloworld"); // Does not print string 
    test_template(str); // Prints string 
    test_template(10.00); // Prints double 

    return 0; 
} 

क्यों नहीं करता करता test_template(str) प्रिंट जबकि test_template("Helloworld") "स्ट्रिंग"?

BTW, मेरी जी ++ संस्करण ग्राम (उबंटू 5.4.0-6ubuntu1 ~ 16.04.4) 5.4.0 "Helloworld" तरह 20160609.

+17

डाउनवॉट्स क्यों? बेशक, यह एक बुनियादी स्तर पर है, लेकिन सवाल पूर्ण, स्पष्ट है, और ओपी में एक कंपाइलर संस्करण भी शामिल है! – TartanLlama

+3

'" Helloworld "' 'std :: string' नहीं है। लेकिन '" होलोर्ल्ड "एस होगा। – Jarod42

+2

@TartanLlama: मुझे लगता है कि यह एक उपयोगकर्ता की वजह से है जो बहुत ही नाजुक कोड लिखने के लिए 'टाइपिड' का उपयोग करना चाहता है। –

उत्तर

22

इस कॉल

test_template("Helloworld"); // Does not print string 

तर्क "Helloworld" में एक स्ट्रिंग शाब्दिक है कि टाइप const char[11] है।

क्योंकि समारोह पैरामीटर संदर्भित प्रकार

void test_template(const T &t) 
          ^^^ 
तो समारोह तर्क (अधिक सटीक पैरामीटर) के भीतर

है प्रकार const char (&t)[11] है।

सी ++ में स्ट्रिंग अक्षर में स्ट्रिंग शाब्दिक प्लस टर्मिनिंग शून्य में वर्णों की संख्या के बराबर तत्वों की संख्या के साथ स्थिर वर्ण सरणी के प्रकार होते हैं।

इस कॉल में

test_template(str); 

तर्क टाइप std::string क्योंकि चर str तरह

string str = "ok"; 
^^^^^^ 

यह स्ट्रिंग द्वारा प्रारंभ किया गया था घोषित किया जाता है है शाब्दिक "ok" फिर भी वस्तु ही प्रकार std::string की है ।

+1

'कंक चार' को 'कॉन्स्ट चार' होना चाहिए? (मैं केवल एक बदलाव के साथ एक संपादन सबमिट नहीं कर सकता।) –

+0

@ क्रिस्टोफस्ट्रोबेबे आपका क्या मतलब है? –

+0

ठीक है, आपके जवाब में 'conat char (& t) [11]' में 'conat''। –

9

स्ट्रिंग शाब्दिक वर्णों की स्थिरांक सरणियों हैं ++ है।

std::string कक्षा में एक निर्माता है जो स्ट्रिंग अक्षर के लिए पॉइंटर्स ले सकता है, लेकिन एक स्ट्रिंग अक्षर अपने आप में std::string ऑब्जेक्ट नहीं है।


एक साइड-नोट के रूप में, आपके जैसे फ़ंक्शन का उपयोग करके कोड-गंध और खराब डिज़ाइन माना जाता है। इसके बजाय अलग-अलग तर्क लेने वाले अधिभारित फ़ंक्शंस का उपयोग करें। इससे तारों के साथ आपकी समस्या भी हल हो जाएगी।

+3

सहमत हैं, यहां पर एक टेम्पलेट रखने का कोई मतलब नहीं है। कोई आम कार्यक्षमता नहीं है। – AndyG

+1

धन्यवाद! मैं इसके बजाय अधिभारित कार्यों का उपयोग करने पर विचार करूंगा। – Meehatpa

16

सी ++ में स्ट्रिंग अक्षर const char[N+1] प्रकार हैं, जहां N स्ट्रिंग में वर्णों की संख्या है। std::string एक मानक पुस्तकालय वर्ग है जो एक स्ट्रिंग का मालिक है और इसमें कई संचालन प्रदान करता है। std::string को const char[N] से बनाया जा सकता है, लेकिन वे एक ही चीज़ नहीं हैं।

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