क्या एक कास्ट ऑपरेटर स्पष्ट हो सकता है?


84

जब यह कंस्ट्रक्टर्स की बात आती है, तो कीवर्ड जोड़ना explicitएक उत्साही कंपाइलर को ऑब्जेक्ट बनाने से रोकता है जब यह प्रोग्रामर का पहला इरादा नहीं था। क्या इस तरह का तंत्र कास्टिंग ऑपरेटरों के लिए भी उपलब्ध है?

struct Foo
{
    operator std::string() const;
};

यहाँ, उदाहरण के लिए, मैं इसमें Fooएक कास्ट करने में सक्षम होना चाहूंगा std::string, लेकिन मैं नहीं चाहता कि ऐसी कास्ट निहित हो।

जवाबों:


101

हां और ना।

यह निर्भर करता है कि आप C ++ के किस संस्करण का उपयोग कर रहे हैं।

  • C ++ 98 और C ++ 03 explicitप्रकार रूपांतरण ऑपरेटरों का समर्थन नहीं करते हैं
  • लेकिन C ++ 11 करता है।

उदाहरण,

struct A
{
    //implicit conversion to int
    operator int() { return 100; }

    //explicit conversion to std::string
    explicit operator std::string() { return "explicit"; } 
};

int main() 
{
   A a;
   int i = a;  //ok - implicit conversion 
   std::string s = a; //error - requires explicit conversion 
}

इसे संकलित करें g++ -std=c++0x, आपको यह त्रुटि मिलेगी:

prog.cpp: 13: 20: error: गैर-स्केलर प्रकार 'std :: string' में 'ए' से रूपांतरण का अनुरोध किया गया

ऑनलाइन डेमो: http://ideone.com/DJut1

लेकिन जैसे ही आप लिखते हैं:

std::string s = static_cast<std::string>(a); //ok - explicit conversion 

त्रुटि दूर हो जाती है: http://ideone.com/LhuFd

BTW, C ++ 11 में, स्पष्ट रूपांतरण ऑपरेटर को "संदर्भ रूपांतरण ऑपरेटर" के रूप में संदर्भित किया जाता है यदि यह बूलियन में परिवर्तित हो जाता है । इसके अलावा, यदि आप निहित और स्पष्ट रूपांतरणों के बारे में अधिक जानना चाहते हैं, तो इस विषय को पढ़ें:

उम्मीद है की वो मदद करदे।


9
C ++ 03 में भी, अंतर्निहित रूपांतरण से बचना आसान है। केवल फ़ंक्शन को कॉल करें toString, बजाय operator std::string। बेशक, यह कुछ टेम्प्लेट के साथ समस्याएं पैदा कर सकता है। मैंने हमेशा उपयोग किया है toString, और इससे मुझे कभी कोई समस्या नहीं हुई, लेकिन मुझे लगता है कि यह आपकी कोडिंग शैली पर निर्भर कर सकता है।
बजे जेम्स कान्जे

@MatthieuM। जैसे operator std::string():-)।
जेम्स कांजे

2
मैं to_stringइसके बजाय का उपयोग करें । यह मदद करता है कि इसे C ++ 11 कहते हैं, इसलिए यह फॉरवर्ड-संगत कोड लिखने में मदद करता है और यह टेम्पलेट्स के साथ मदद करता है।
लुइस मचुका

1
std::string s(a)या std::string s{a}के रूप में भी काम करना चाहिए static_cast<std::string>(a)
alfC

2
@ बिन: क्योंकि संकलक द्वारा प्रासंगिक रूप से explicit operator bool() लागू किया जाता है जब आप लिखते हैं । यहां होने वाले रूपांतरण पर ध्यान दें (अनौपचारिक) जिसे प्रासंगिक रूपांतरण कहा जाता है , न कि अंतर्निहित रूपांतरण। if(std::cin)
नवाज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.