2012-05-31 14 views
10

मैं अगर मैं क्या लिख ​​रहा हूँ समझ में आता है पता नहीं है, लेकिन मुझे याद मैंने देखा कि एक समारोह इस तरह ivoked:स्ट्रिंगस्ट्रीम को फ़ंक्शन पैरामीटर के रूप में पास करना संभव है?

my_func(ss << "text" << hex << 33); 

क्या यह संभव है?

+1

इसे आजमाने के लिए मुश्किल नहीं होना चाहिए? – aztaroth

उत्तर

11

निश्चित बात। ऐसा क्यों नहीं होगा? उदाहरण के लिए इस तरह के समारोह की घोषणा:

void my_func(std::ostringstream& ss); 
+0

धन्यवाद, जो मुझे याद आया, मुझे पता था कि यह कुछ हद तक संभव है लेकिन मुझे नहीं पता था कि – rsk82

+2

उस प्रभाव को प्राप्त करने के लिए घोषणा का उपयोग किस प्रकार किया गया है इसके अलावा 'एसएस << "परीक्षण" << हेक्स << 33' का प्रकार नहीं है 'std :: stringstream &', लेकिन 'std :: ostream &', और वह दिए गए हस्ताक्षर से मेल नहीं खाएगा। –

+0

@ जेम्स कानज़ यह बिल्कुल सही है। –

7

बिल्कुल! सुनिश्चित करें कि आप संदर्भ द्वारा इसे पास करते हैं, मूल्य से नहीं।

void my_func(ostream& stream) { 
    stream << "Hello!"; 
} 
1

हाँ, यह है, और

Function(expresion) 

देगा अभिव्यक्ति पहले मूल्यांकन किया जाना है और इसका परिणाम एक पैरामीटर

नोट के रूप में पारित हो जाएगा: Operator << for ostreams एक ostream रिटर्न

3

my_func की लाइनों के साथ हस्ताक्षर होना चाहिए:

void my_func(std::ostream& s); 

, क्योंकि यह ss << "text" << hex << 33 का प्रकार है। लक्ष्य है उत्पन्न स्ट्रिंग को निकालने के लिए, की तरह कुछ करने के लिए you'ld: है कि आप एक अस्थायी धारा उपयोग नहीं कर सकते भी

void 
my_func(std::ostream& s) 
{ 
    std::string data = dynamic_cast<std::ostringstream&>(s).str(); 
    // ... 
} 

नोट;

my_func(std::ostringstream() << "text" << hex << 33); 

संकलित नहीं होगा (शायद वीसी ++ के साथ), क्योंकि यह कानूनी सी ++ नहीं है। आप की तरह कुछ लिख सकते हैं:

my_func(std::ostringstream().flush() << "text" << hex << 33); 

अगर आप एक अस्थायी उपयोग करना चाहता था। लेकिन यह बहुत उपयोगकर्ता के अनुकूल नहीं है।

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

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