2016-04-12 5 views
5

शीर्षक to_string यह सब कहते हैं वास्तव में। उन्होंनेक्यों एसटीडी के लिए कोई std :: स्ट्रिंग अधिभार ::

namespace std 
{ 
    std::string to_string(const std::string&) 
} 

अधिभार क्यों नहीं चुना?

मेरे पास एक ऐसा प्रोग्राम है जो पंक्ति अनुक्रमणिका या पंक्ति नाम से कुछ डेटा पूछ सकता है; टेम्पलेट्स के लिए आदर्श। जब तक मैं अगर एक पंक्ति एक्सेस किए जा रहे एक त्रुटि संदेश का निर्माण करने की कोशिश याद आ रही है:

template <typename T> 
int read(T nameOrIndex) 
{ 
    if (!present(nameOrIndex)) 
    { 
     // This does not compile if T is std::string. 
     throw std::invalid_argument("Missing row: " + std::to_string(nameOrIndex)); 
    } 
} 

मैं std नाम स्थान के लिए अपने ही अधिभार जोड़ सकता है लेकिन यह है कि आदर्श नहीं है।

+2

यह शायद सिर्फ निरीक्षण की वजह से याद आ रही है। –

+4

यदि आपका नाम अन्य प्रकारों की संख्या भी है तो आपका कोड संकलित नहीं होगा। उन सभी के बारे में क्या? क्या 'to_string' कार्यान्वयन होना चाहिए जो मनमानी प्रकारों के लिए कुछ स्ट्रिंग देता है? 'Std' (जो अवैध है) में' to_string' अधिभार जोड़ने के बजाय, मैं उसी नामस्थान में 'read'' के रूप में अपना स्वयं का 'to_string' ओवरलोड बनाउंगा। उस से 'std :: to_string' पर प्रतिनिधि, और ओवरलोड से है कि तर्क को वापस करें जो' std :: string const & 'लेता है। – Praetorian

+2

'std :: to_string' अंतर्निहित संख्यात्मक प्रकार तारों में परिवर्तित करता है। तारों को तारों में "रूपांतरित" करने की कोई आवश्यकता नहीं है क्योंकि वे पहले से ही तार हैं। –

उत्तर

9

के बजाय अपने खुद के std नाम स्थान है, जो एक बहुत बुरा हल है में std::string लेने अधिभार परिभाषित करते हैं, तो बस इस के बजाय कार्य करें:

#include <iostream> 
#include <string> 

std::string to_string(const std::string& value) 
{ 
    return value; 
} 

template <typename T> 
void display(T value) 
{ 
    using namespace std; 
    std::cout << to_string(value) << std::endl; 
} 

int main() 
{ 
    display("ABC"); 
    display(7); 
} 
+0

यह कोड एडीएल का उपयोग नहीं करता है, क्योंकि तर्कों में अंतर्निहित प्रकार है। इसके बजाय, 'डिस्प्ले' फ़ंक्शन 'std' से नाम लाता है, ताकि अनुपयुक्त लुकअप में लुकअप सेट में 'std :: to_string' और' :: to_string' दोनों हों। –

1

मुझे लगता है कि क्यों अधिभार में नहीं है नहीं जा रहा हूँ मानक पुस्तकालय लेकिन यहां एक सरल समाधान है जिसका आप उपयोग कर सकते हैं। std::to_string के बजाय, boost::lexical_cast का उपयोग करें।

template <typename T> 
int read(T nameOrIndex) 
{ 
    if (!present(nameOrIndex)) 
    { 
     throw std::invalid_argument { 
      "Missing row: " + boost::lexical_cast<std::string>(nameOrIndex) 
     }; 
    } 
    // … 
} 

यदि आप बूस्ट निर्भरता नहीं चाहते हैं, तो आप आसानी से इसके लिए अपना कार्य रोल कर सकते हैं।

template <typename T> 
std::string 
to_string(const T& obj) 
{ 
    std::ostringstream oss {}; 
    oss << obj; 
    return oss.str(); 
} 

यह स्पष्ट रूप से अनुकूलित नहीं है लेकिन आपके मामले के लिए पर्याप्त हो सकता है।

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