मैं उस मैक्रो मेरे जैसे कुछ करने के लिए अनुमति होगी लिखने के लिए कोशिश कर रहा हूँ: FORMAT(a << "b" << c << d)
है, और परिणाम एक स्ट्रिंग होगा - एक ostringstream बनाने, a...d
डालने, और .str()
लौटने के रूप में ही । कुछ ऐसा:सी ++ प्रारूप मैक्रो/इनलाइन ostringstream
string f(){
ostringstream o;
o << a << "b" << c << d;
return o.str()
}
अनिवार्य रूप से, FORMAT(a << "b" << c << d) == f()
।
पहले, मैं करने की कोशिश की:
1: #define FORMAT(items) \
((std::ostringstream&)(std::ostringstream() << items)).str()
तो बहुत पहले आइटम एक सी स्ट्रिंग (const char *
), यह हेक्स में तार का पता प्रिंट होगा, और अगले आइटम ठीक प्रिंट होगा है। यदि पहला आइटम std::string
है, तो यह संकलित करने में विफल रहेगा (कोई मिलान करने वाला ऑपरेटर <<
)।
यह:
2: #define FORMAT(items) \
((std::ostringstream&)(std::ostringstream() << 0 << '\b' << items)).str()
देता है कि क्या सही उत्पादन की तरह लगता है, लेकिन 0
और \b
निश्चित रूप से स्ट्रिंग में मौजूद हैं।
निम्नलिखित काम करने के लिए लगता है, लेकिन चेतावनी (अस्थायी का पता लेने) के साथ संकलित:
3: #define FORMAT(items) \
((std::ostringstream&)(*((std::ostream*)(&std::ostringstream())) << items)).str()
क्या किसी को पता है कि क्यों 1 प्रिंट सी स्ट्रिंग के पते और std::string
साथ संकलित करने के लिए विफल रहता है? 1 और 3 अनिवार्य रूप से वही नहीं हैं?
मुझे संदेह है कि सी ++ 0x वैरैडिक टेम्पलेट format(a, "b", c, d)
संभव बना देगा। लेकिन क्या अब इसे हल करने का कोई तरीका है?
मैं पहले पैराग्राफ को ऊपर उठाऊंगा, लेकिन पूरा जवाब नहीं। –
धन्यवाद, यह बहुत जानकारीपूर्ण है। मैंने बूस्ट का उपयोग नहीं किया है, यह देखना दिलचस्प है कि वहां क्या है। – cadabra
क्यों बाध्य नहीं हो सकता है? –