2015-10-22 36 views
6

मैं एक मैक्रो है कि मैं एक बहुत का उपयोग करें, एक और सवाल से प्रेरित है:एक C++ एक समारोह के रूप मैक्रो नए सिरे से लिखना, आदि

#define to_string(x) dynamic_cast<ostringstream &> ((ostringstream() << setprecision(4) << dec << x)).str() 

यह एक कार्यों स्ट्रिंग आदानों लेने के साथ प्रयोग में उदाहरण के लिए अत्यंत उपयोगी है:

some_function(to_string("The int is " << my_int)); 

हालांकि मुझे बताया गया है कि सी ++ में मैक्रोज़ का उपयोग करना बुरा अभ्यास है, और वास्तव में मुझे उपरोक्त विभिन्न कंपेलरों पर काम करने में समस्याएं आई हैं। क्या इसे एक और निर्माण के रूप में लिखने का कोई तरीका है, उदा। एक समारोह, जहां यह समान बहुमुखी प्रतिभा होगी?

+3

'std :: to_string' एक संगत तरीका एक std::ostringstream आवरण कि परोक्ष std::string के लिए परिवर्तनीय है बनाने के लिए है? – Downvoter

उत्तर

6

सी ++ 11 और इससे अधिक में अब हमारे पास std::to_string है। हम डेटा को एक स्ट्रिंग में कनवर्ट करने के लिए इसका उपयोग कर सकते हैं जो इसे आप चाहते हैं।

some_function("The int is " + std::to_string(my_int)); 
+0

धन्यवाद! लेकिन क्या मुझे इसे ऊपर लिखने की ज़रूरत है? यह मूल मैक्रो की तुलना में थोड़ा अधिक गन्दा है, और मुझे कोड का थोड़ा सा लिखना होगा। – jorgen

+1

@jorgen हां। यह प्रत्यक्ष प्रतिस्थापन नहीं है। मैक्रो के साथ आपके पास यह तरीका है कि मैंने देखा है कि उपर्युक्त कोड को फिर से लिखने के बिना किया गया एकमात्र तरीका है। – NathanOliver

2

विडंबना यह है कि to_string वह है जो आप यहां चाहते हैं। to_string("The int is " << my_int)

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

बजाय

"The int is " + to_string(my_int)

यह एक string वापस आ जाएगी।

[Live Example]

7

आपका मैक्रो std::to_string प्रदान करता है और अधिक से अधिक संभावनाएं है। यह << ऑपरेटरों के किसी भी समझदार अनुक्रम को स्वीकार करता है, एक डिफ़ॉल्ट सटीकता और दशमलव आधार सेट करता है।

class Stringify { 
    public: 
     Stringify() : s() { s << std::setprecision(4) << std::dec; }; 

     template<class T> 
     Stringify& operator<<(T t) { s << t; return *this; } 

     operator std::string() { return s.str(); } 
    private: 
     std::ostringstream s; 
}; 

void foo(std::string s) { 
    std::cout << s << std::endl; 
} 

int main() 
{ 
    foo(Stringify() << "This is " << 2 << " and " << 3 << " and we can even use manipulators: " << std::setprecision(2) << 3.1234); 
} 

लाइव: http://coliru.stacked-crooked.com/a/14515cabae729875

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