2009-05-05 10 views
6

Tôi có lớp C++ MyObject và tôi muốn có thể cung cấp dữ liệu này giống như một osstream (nhưng không giống như luồng trực tiếp, có dữ liệu đến được định dạng cách đặc biệt). Tôi không thể tìm ra cách để quá tải một nhà điều hành cho MyObject ăn đầu vào cho nó.Có một lớp C++ hoạt động giống như một dòng ost tùy chỉnh, dòng

class MyObject { 
public: 
    ostringstream s; 
    FEEDME 
}; 


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

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

} 

Tôi muốn nó như vậy mỗi item ăn ở được bao quanh bởi::

Vì vậy, trong ví dụ trên, s = ": Xin chào :: 12345" nên kết quả cuối cùng. Câu hỏi của tôi là gì, làm thế nào tôi có thể nói với đối tượng rằng khi nào có một <<something, hãy đặt:: xung quanh cái gì đó.

Điều này có khả thi không?

Trả lời

9

thử điều này:

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; 

Có những điều chắc chắn bạn sẽ không thể xô vào trong dòng, nhưng nó phải làm việc cho tất cả những điều cơ bản.

+0

Cảm ơn, tôi nghĩ rằng tôi có chỗ đứng trên làm thế nào để thực hiện nó bây giờ, vẫn nhận được một lỗi "lỗi: sử dụng không hợp lệ của thành viên (? Bạn đã quên '&')" cho MyObject & operator < <(const T & x) { Nhưng sẽ gây rối với nó và được giải quyết. Cảm ơn bạn tốt. –

+0

Tôi nghĩ rằng biên dịch tốt trong g ++ 4.3.3, trình biên dịch nào đang sử dụng? –

+0

g ++ (GCC) 4.3.2, bạn chính xác nó biên dịch và hoạt động chính xác như tôi muốn nó! Cảm ơn bạn. Vấn đề có vẻ là một cái gì đó đặc biệt cho chương trình của tôi. –

1

Tôi sẽ có cách tiếp cận hơi khác và tạo đối tượng định dạng.
Đối tượng định dạng sau đó sẽ xử lý việc chèn ký tự định dạng khi nó được áp dụng cho luồng.

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