2009-05-05 15 views
6

जैसे सी ++ क्लास एक्ट है मेरे पास सी ++ क्लास MyObject है और मैं इस डेटा को फीड करने में सक्षम होना चाहता हूं जैसे कि मैं ओएसस्ट्रीम (लेकिन प्रत्यक्ष एसस्ट्रीम के विपरीत, इनकमिंग डेटा को स्वरूपित किया जाना चाहिए विशेष तरीका)। मुझे यह पता लगाना प्रतीत नहीं होता है कि माइऑब्जेक्ट के लिए दिए गए इनपुट को खाने के लिए ऑपरेटर को ओवरलोड कैसे करें।एक कस्टम ओस्ट्रीम, एसस्ट्रीम

class MyObject { 
public: 
    ostringstream s; 
    FEEDME 
}; 


int main() { 
    MyObject obj; 
    obj.FEEDME << "Hello" << 12345; 

    // I want obj.s == ":Hello::12345:" 

} 

मैं चाहता हूँ यह इतना में खिलाया हर आइटम से घिरा हो:

तो दिए गए उदाहरण में, एस = ": हैलो :: 12345" अंतिम परिणाम होना चाहिए। मेरा सवाल क्या है, मैं इस ऑब्जेक्ट को कैसे बता सकता हूं कि जब कभी <<something, डाल दें:: कुछ के आसपास।

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

उत्तर

9

इस प्रयास करें:

class MyObject { 
public: 
    template <class T> 
    MyObject &operator<<(const T &x) { 
     s << ':' << x << ':'; 
     return *this; 
    } 

    std::string to_string() const { return s.str(); } 

private: 
    std::ostringstream s; 
}; 

MyObject obj; 
obj << "Hello" << 12345; 
std::cout << obj.to_string() << std::endl; 

वहाँ कुछ चीजें आप धारा में गिरवी रखना में सक्षम नहीं होगा, लेकिन यह सभी मूल के लिए काम करना चाहिए।

+0

धन्यवाद, मुझे लगता है कि मैं कैसे अब इसे लागू करने, अभी भी एक त्रुटि मिल रही है पर आधार है: के लिए MyObject और ऑपरेटर "त्रुटि सदस्य के अवैध उपयोग (? आप 'और' भूल गए)" < <(कॉन्स टी एंड एक्स) { लेकिन इसके साथ गड़बड़ हो जाएगी और हल हो जाएगी। धन्यवाद प्रिय महोदय। –

+0

मुझे लगता है कि g ++ 4.3.3 में ठीक संकलित करता है, कौन सा कंपाइलर उपयोग कर रहा है? –

+0

जी ++ (जीसीसी) 4.3.2, आप इसे सही बनाते हैं और ठीक उसी तरह काम करता है जैसे मैं इसे चाहता हूं! धन्यवाद। समस्या मेरे कार्यक्रम के लिए कुछ खास प्रतीत होती है। –

1

मैं थोड़ा अलग दृष्टिकोण लेता हूं और एक फॉर्मेटर ऑब्जेक्ट बनाता हूं।
फॉर्मेटर ऑब्जेक्ट तब स्ट्रीम वर्ण पर डालने पर प्रारूप चरित्र डालने को संभालेगा।

#include <iostream> 

template<typename T> 
class Format 
{ 
    public: 
     Format(T const& d):m_data(d) {} 
    private: 
     template<typename Y> 
     friend std::ostream& operator<<(std::ostream& str,Format<Y> const& data); 
     T const& m_data; 
}; 
template<typename T> 
Format<T> make_Format(T const& data) {return Format<T>(data);} 

template<typename T> 
std::ostream& operator<<(std::ostream& str,Format<T> const& data) 
{ 
    str << ":" << data.m_data << ":"; 
} 




int main() 
{ 
    std::cout << make_Format("Hello") << make_Format(123); 
}