2011-04-28 24 views
8

Làm cách nào để viết các trình xử lý luồng do người dùng xác định trong C++ kiểm soát định dạng phát trực tiếp một lớp tự viết?Làm thế nào để viết các thao tác do người dùng xác định để phát trực tuyến lớp tự viết

Cụ thể, làm cách nào để tôi viết các thao tác đơn giản verboseterse để kiểm soát lượng đầu ra được truyền trực tuyến?

Môi trường của tôi là GCC, phiên bản 4.5.1 trở lên.

Ví dụ:

class A 
{ 
... 
}; 

A a; 

// definition of manipulators verbose and terse 

cout << verbose << a << endl; // outputs a verbosely 
cout << terse << a << endl; // outputs a tersely 

PS: Sau đây chỉ là một câu hỏi phụ, cảm thấy tự do để bỏ qua nó: Có thể điều này portably được mở rộng để thao tác lấy lý lẽ? Josuttis viết trong "Thư viện chuẩn C++" gần cuối phần 13.6.1 mà việc viết các thao tác tham gia là thực hiện phụ thuộc. Điều này vẫn đúng?

+0

Không phải là bản sao mà là chủ đề liên quan (thú vị): [Trình xử lý luồng hoạt động như thế nào?] (Http://stackoverflow.com/questions/4633864/how-do-the-stream-manipulators-work) – Nawaz

Trả lời

2

Tôi không thấy bất kỳ lý do nào khiến chúng phụ thuộc triển khai.

Đây là sự comething mà tôi sử dụng, đối với trình điều khiển thực tế, tạo một hàm trả về một cá thể của trình trợ giúp sau. Nếu bạn cần lưu trữ dữ liệu, chỉ cần lưu trữ nó bên trong helper, một số biến toàn cầu, singleton, vv ...

/// One argument manipulators helper 
    template < typename ParType > 
    class OneArgManip 
    { 
     ParType par; 
     std::ostream& (*impl)(std::ostream&, const ParType&); 

     public: 
      OneArgManip(std::ostream& (*code)(std::ostream&, const ParType&), ParType p) 
       : par(p), impl(code) {} 

      // calls the implementation 
      void operator()(std::ostream& stream) const 
      { impl(stream,par); } 

      // a wrapper that allows us to use the manipulator directly 
      friend std::ostream& operator << (std::ostream& stream, 
          const OneArgManip<ParType>& manip) 
      { manip(stream); return stream; } 
    }; 

Ví dụ về thao túng dựa trên này:

OneArgManip<unsigned> cursorMoveUp(unsigned c) 
{ return OneArgManip<unsigned>(cursorMoveUpI,c); } 

std::ostream& cursorMoveUpI(std::ostream& stream, const unsigned& c) 
{ stream << "\033[" << c << "A"; return stream; } 

Đối với một số lời giải thích :

  1. u sử dụng thao túng, mà trả về một thể hiện mới của các helper ràng buộc để một thực hiện các helper
  2. suối cố gắng để xử lý helper, dùng để gọi << quá tải trên helper
  3. đó gọi các nhà điều hành () trên helper
  4. đó gọi việc thực hiện thực sự của helper với tham số truyền từ các cuộc gọi thao túng ban đầu

Nếu bạn muốn Tôi có thể gửi 2 param và 3 param trợ giúp là tốt. Nguyên tắc là như nhau mặc dù.

+0

Cảm ơn Tuy nhiên, tôi đã nghĩ đến những người thao túng có ảnh hưởng đến cách thức các mục sau này được truyền trực tiếp. –

+0

@Peter đó là điều tương tự. Bạn chỉ cần lưu cài đặt ở đâu đó. Thay vì xuất một thứ gì đó vào luồng bạn đặt 'YourClass :: outputtype' hoặc một cái gì đó tương tự. –

Các vấn đề liên quan