2013-04-05 6 views
6

मेरे पास कुछ स्ट्रिंग-जैसी कक्षाएं हैं जिन्हें स्पष्ट रूप से स्ट्रिंग में परिवर्तित किया जा सकता है। मेरे पास इनके लिए कुछ उपयोग हैं;सी ++ स्ट्रिंग-जैसी कक्षा निहित रूपांतरण के साथ

class TranslatableString 
{ 
public: 
    explicit TranslatableString(const char *s) : native_text_(s) {} 
    operator const char *() const { return gettext(native_text_); } 

    // Or not - see below: 
    operator const std::string() const { return gettext(native_text_); } 

private: 
    const char * const native_text_; 
}; 

अब मैं एक स्ट्रिंग शाब्दिक की तरह के रूप में ज्यादा का उपयोग कर यह होना चाहिए, इस वर्ग यथासंभव सरल (यानी का उपयोग कर बनाने के लिए कोशिश कर रहा हूँ: एक उदाहरण पाठ gettext द्वारा कार्यावधि में अनुवाद करने की आवश्यकता है कि पकड़ करने के लिए है यथासंभव)। विशेष रूप से, मैं निम्न नमूना उपयोगों के दोनों काम करने के लिए करना चाहते हैं:

const TranslatableString HELLO = TranslatableString("Hello, world!"); 

std::string ExampleA() { 
    return HELLO; 
} 

void ExampleB() { 
    std::string s; 
    s = HELLO; 
} 

दोनों उदाहरण काम करने के लिए कोई तरीका है?

  • अगर मैं operator std::string में शामिल हैं, तो ExampleB संकलित करने के लिए कह रही है std::string::operator=(const char *) और std::string operator=(const std::string&) (जो समझ में आता है) के बीच एक अस्पष्टता नहीं है कि विफल रहता है,।
  • यदि मुझे operator std::string शामिल नहीं है, तो exampleA संकलित करने में विफल रहता है; स्पष्ट रूप से स्पष्ट रूप से एक अनुवादक स्ट्रिंग को कॉन्स्ट चार से * std :: स्ट्रिंग में परिवर्तित करने की अनुमति नहीं है, हालांकि मुझे सी ++ के निहित रूपांतरण नियमों को समझाने के लिए पर्याप्त रूप से समझ में नहीं आता है।

उत्तर

5

प्रत्येक रूपांतरण अनुक्रम में केवल एक उपयोगकर्ता द्वारा परिभाषित रूपांतरण की अनुमति है, यही कारण है कि आप const char* "के माध्यम से" नहीं जा सकते हैं। (ध्यान दें कि const char* से std::string भी उपयोगकर्ता द्वारा परिभाषित रूपांतरण है)।

क्या आपको const char* पर रूपांतरण की आवश्यकता है? इसके बिना (और कवर के साथ std::string), दोनों उदाहरण काम करेंगे।

const char* के बजाय डेटा को std::string पर संग्रहीत करने पर भी विचार करना उचित हो सकता है। आपको डीलोकेशन मुद्दों के बारे में चिंता करने की ज़रूरत नहीं है, आपके हाथों के नीचे "गायब" डेटा

+0

समझ में आता है। धन्यवाद। (यह विशेष वर्ग केवल स्ट्रिंग अक्षर के साथ प्रयोग करने के लिए डिज़ाइन किया गया है, इसलिए 'कॉन्स्ट char *' ठीक है; कहीं और, मैं लगभग हमेशा 'std :: string' का उपयोग करता हूं।) –

1

आपको operator const char * पर छोड़ देना होगा। इसे explicit (सी ++ 11) बनाएं या इसे c_str विधि के बजाय प्रदान करें।

TranslatableString से const char * से std::string कनवर्ट करने की अनुमति नहीं है क्योंकि इसमें दो उपयोगकर्ता परिभाषित रूपांतरण शामिल हैं।

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