2015-10-26 18 views
8

में कनवर्ट करने का एक मानक तरीका है जावा में, क्लास को स्ट्रिंग प्रस्तुति को वापस करने के लिए विधि toString() को परिभाषित करना है। operator<< ओवरलोडिंग के अलावा, क्या सी ++ में ऐसा कोई मानक है? मुझे पता है कि संख्या के स्ट्रिंग प्रस्तुति के लिए std::to_string() विधियां हैं। क्या सी ++ मानक कक्षा के समान उद्देश्य प्रदान करने के लिए विधि to_string() को परिभाषित करने की बात करता है, या सी ++ प्रोग्रामर के बाद एक सामान्य अभ्यास है?क्या क्लास को स्ट्रिंग

+0

ऐसी संरचनाओं की तरह लगता है जिन्हें 'toString() 'विधि की आवश्यकता होती है जो उन लोगों द्वारा अधिक नहीं होंगे। एकदम मेरे विचार। –

+0

आप इस '* मानक *' विधि का प्रभाव क्या चाहते हैं? सी ++ में 'स्ट्रिंग में रूपांतरण' को परिभाषित करने का कोई मानक तरीका नहीं है (जो अधिकतर समझदारी से संभव नहीं है) और इसलिए इस तरह के रूपांतरण का अनुरोध करने का कोई मानक तरीका नहीं है। – Walter

+0

कुछ भी आपको अपनी कक्षाओं के लिए to_string() ओवरलोड प्रदान करने से रोकता है (या किसी अन्य नाम के साथ अपना स्वयं का फ़ंक्शन/विधि बनाना) – deviantfan

उत्तर

1

विधि to_string() को परिभाषित करने के लिए एक वर्ग के लिए समान उद्देश्य पूरा करने के लिए की सी ++ मानक बात,

सं

करता है या वहाँ एक आम बात सी ++ प्रोग्रामर द्वारा पीछा किया है ।

नहीं। हालांकि, मुझे संदेह है कि प्रत्येक प्रोजेक्ट की समान कार्यक्षमता है। नाम और वापसी का प्रकार सबसे अधिक संभावना एक परियोजना के कोडिंग दिशानिर्देशों पर निर्भर करता है।

मेरे काम में, हम अपने आधार वर्ग में से एक में

virtual QString toString() const = 0; 

का उपयोग करें।

आप अपनी परियोजना के लिए कुछ इसी तरह का उपयोग शुरू कर सकते हैं।

virtual std::string toString() const = 0; 

आपकी बेस क्लास (es) में।

5

इस तरह की चीज करने का मानक तरीका सम्मिलन ऑपरेटर प्रदान करना है ताकि एक ऑब्जेक्ट स्ट्रीम में डाला जा सके - जो किसी भी प्रकार की धारा हो सकती है, जैसे स्ट्रिंगस्ट्रीम।

यदि आप चाहें, तो आप एक विधि भी प्रदान कर सकते हैं जो एक स्ट्रिंग (आपके सम्मिलन ऑपरेटर के लिए उपयोगी) में परिवर्तित हो, और यदि आपको रूपांतरण स्वीकार्य लगता है, तो आप 'स्ट्रिंग' ऑपरेटर प्रदान कर सकते हैं।

यहाँ मेरी मानक 'बिंदु' वर्ग उदाहरण है:

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

अब मैं इसे आसानी से उपयोग कर सकते हैं:

template <typename T> 
struct point 
{ 
    T x; 
    T y; 
    point(): x(), y() { } 
    point(T x, T y): x(x), y(y) { } 
}; 

template <typename T> 
std::ostream& operator << (std::ostream& outs, const point <T> & p) 
{ 
    return outs << "(" << p.x << "," << p.y << ")"; 
} 

मैं भी तार करने के लिए चीजों को परिवर्तित करने के लिए चारों ओर एक आसान समारोह रखने के लिए करते हैं

int main() 
{ 
    point p (2,-7); 

    std::cout << "I have a point at " << p << ".\n"; 

    my_fn_which_takes_a_string(to_string(p)); 

आप पाएंगे कि Boost Lexical Cast Library इस तरह की चीज़ के लिए भी डिज़ाइन किया गया है।

उम्मीद है कि इससे मदद मिलती है।

4

सी ++ मानक यह करने के लिए एक तरह से लिख नहीं करता है लेकिन ऐसा लगता है एक प्रस्ताव है जो इस तरह के एक विकल्प Generic to_string/to_wstring functions जो प्रेरणा अनुभाग जो भी प्रकाश डाला गया है वर्तमान आम प्रथाओं ले जाया जा रहा (जो मैं दिखाना में कहते हैं उत्पन्न हो जाएं मौजूद है नीचे):

एक लंबे समय के सी ++ प्रोग्रामर लिए एक आसान तरीका की तलाश में गया है अपने स्ट्रिंग प्रतिनिधित्व में एक वस्तु कन्वर्ट। का एक सामान्य उत्तर यह समस्या स्थानीय ओस्ट्रिंगस्ट्रीम बनाने के लिए थी, ऑब्जेक्ट को स्ट्रीम में डालें, और उसके बाद परिणामी स्ट्रिंग को स्ट्र सदस्य फ़ंक्शन के साथ प्राप्त करें। यह समाधान सरल, सुरक्षित, लचीला और एक्स्टेंसिबल है, हालांकि निश्चित रूप से किसी भी फ़ंक्शन कॉल के लिए निश्चित रूप से वर्बोज़ है। सी ++ 11 प्रदान किया गया (आंशिक) ओवरलोडेड to_string/to_wstring फ़ंक्शंस के सेट के रूप में समाधान। दुर्भाग्यवश, ये केवल संख्यात्मक प्रकारों तक ही सीमित हैं। गैर मानक समाधान भी मौजूद हैं - सबसे विशेष रूप से बूस्ट :: lexical_cast, जो ऑब्जेक्ट्स के दो-तरफा रूपांतरण और स्ट्रिंग प्रदान करता है, लेकिन किसी भी स्वरूपण नियंत्रण की कमी है।

  • किसी भी प्रकार कि एक धारा उत्पादन ऑपरेटर प्रदान करता है के लिए और किसी भी basic_string विशेषज्ञता के लिए मौजूदा to_string/to_wstring कार्यों सामान्यीकरण करता,
  • सुसंगत और ज्यादातर इन के साथ संगत रहता है:

    इस पत्र के लिए एक समाधान है कि प्रस्ताव फ़ंक्शंस,

  • अतिरिक्त स्वरूपण और समन्वय क्षमताओं,
  • परिचित ओस्ट्रिंगस्ट्रीम समाधान पर निर्माण करके अवधारणात्मक रूप से सरल है।

दो यात्रा रिपोर्ट STL's और Herb Sutter's रहे हैं और मैं इस पत्र में उल्लेख किया है या तो नहीं दिख रहा। तो उम्मीद है कि यह post-Kona मेलिंग में आने पर मेल किया जाएगा।

पहली विधि वे प्रस्ताव the example in this answer कुछ ऐसा दिखाई देगा में उल्लेख किया है:

class A { 
public: 
    int i; 
}; 

std::ostream& operator<<(std::ostream &strm, const A &a) { 
    return strm << "A(" << a.i << ")"; 
} 

उदाहरण from here को कुछ इसी तरह के साथ संयुक्त:

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

हम में एक boost::lexical_cast उदाहरण मिल सकते हैं प्रश्न Enabling Classes for Use with boost::lexical_cast

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