2009-05-05 20 views
6

Bir C++ sınıfı MyObject var ve bu verileri bir akışa benzer şekilde beslemek istiyorum (ancak doğrudan bir sstream'in aksine, gelen verilerin formatlanması özel yol). MyObject için bir operatörün kendisine verilen girişi yemeye nasıl yükleyeceğini anlayamıyorum.Bir C++ Sınıfı özel bir ostream gibi davranıyor, sstream

class MyObject { 
public: 
    ostringstream s; 
    FEEDME 
}; 


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

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

} 

bu kadar içinde beslenen her öğenin çevrilmesini istiyorum:

Yani verilen örnekte, s = ": Merhaba :: 12345" nihai sonuç olmalıdır. Benim sorum ne, ne zaman bir <<something, bir şey etrafında: koymak etrafında nesneyi söyleyebilirim.

Bu mümkün mü?

cevap

9

bu deneyin:

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; 

Orada akışı içine kıpırdamak mümkün olmayacaktır bazı şeyler vardır, ama tüm temelleri için çalışmalıdır.

+0

sayesinde ben hala bir hata alıyorum, şimdi bunu nasıl uygulanacağı konusunda temele sahip düşünüyorum: için MyObject & operatörünü "hatası (? Eğer '&' unuttunuz mu) üyesinin geçersiz kullanımı" < <(const T & x) { Ama bununla uğraşacak ve çözülecektir. Sağolun efendim. –

+0

Bence bu derleyici hangi g ++ 4.3.3'ü kullanıyor? –

+0

g ++ (GCC) 4.3.2, doğru şekilde derlediniz ve tam istediğim gibi çalışıyorsunuz! Teşekkür ederim. Sorun programım için özel bir şey gibi görünüyor. –

1

Biraz farklı bir yaklaşım alır ve bir formater nesnesi oluştururdum.
Biçim nesnesi, daha sonra bir akışa uygulandığında biçim karakterinin eklenmesiyle ilgilenir.

#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); 
} 
İlgili konular