2014-03-01 72 views
0

我只是好奇是否有可能以某種方式聲明類似於cout的東西,但定義其功能。例如:聲明另一個對象輸出流類似於cout

SetCursorPosition(output_handle, some_COORD); 
cout_coord << "Hi\nthere!"; 

產生這種輸出

. 
       Hi 
       there! 

回答

0

您可以使用運算符重載,使<<基本上做任何事情(只是谷歌「C++運算符重載」,你會發現噸的信息),但這樣的事情在你的問題被普遍認爲濫用運算符重載 。重載操作符旨在使代碼更易於閱讀。在C++中,每個人都知道<<的意思是「輸出內容」,就像+=的意思是「數學上添加內容」,而=的意思是「分配內容」。

當我在某段代碼中看到<<時,我當然不會讀它爲「設置光標位置,然後打印文本」。你可以像這樣實現它,但這是糟糕的編程風格,類似於錯誤的普通函數。

+2

在C++中,每個人都知道'<<'的意思是「左移」。 –

+0

更好的方式來實現這一點,而不需要與運算符混合在一起,就是創建一個'ostream'包裝器來格式化輸出並顯示允許設置格式化選項的成員函數,或者使用自定義操縱器。根據需要,更簡單的方法就是使用現有的操縱器,比如'width()'和對齊操縱器。 –

0

好COUT不是一個函數,它實際上是一個std :: ostream的。您可以創建自己的寫入標準輸出的ostream。

0

實現此邏輯的方法是創建一個自定義流緩衝區,它在其overflow()方法的適當位置寫入,然後使用此流緩衝區創建合適的std::ostream。下面是關於如何將看起來像一個草圖:

class posbuf: public std::streambuf { 
    int d_row;  // current row 
    int d_column; // column where to start output 
    void move() { /* use curses, VT100 codes, whatever to move the cursor */ } 
    int overflow(int c) { 
     if (c == traits_type::eof()) { return traits_type::not_eof(c); } 
     if (c == '\n') { ++this->d_row; this->move(); return '\n'; } 
     return std::cout << traits_type::to_char_type(c)? c: traits_type::eof(); 
    } 
    int sync() { 
     return std::cout.flush()? 0: -1; 
    } 
public: 
    posbuf(int row, int column): d_row(row), d_column(column) { this->move(); } 
}; 
struct oposstream: private virtual posbuf, public std::ostream { 
    oposstream(int row, int column): posbuf(row,c column), std::ostream(this) {} 
}; 

int main() { 
    oposstream out(4, 10); 
    out << "hello\nworld"; 
} 

除了幾個可能的錯別字,並就如何實際移動光標的細節,上面的代碼應該實際工作,並創建一個std::ostream它可以是預計在任何地方通過std::ostream&。任何使用某些模板來重載輸出操作符的嘗試都不會起作用。

+0

這很有趣,但看起來有點複雜,我還沒有完成C++書,我不熟悉你使用的一些函數。我會查找他們,但實際上我找到了我正在尋找的東西,看到我對這個問題的回答。 – Bonnev

0

感謝Christian Hackl和另一位刪除了他們答案的用戶,我做了一項調查並找到了我正在尋找的答案。

如果有人仍好奇我的問題例如成爲:

std::ostream& operator<<(std::ostream& left, const char * right) 
{ 
    string sRight = right; 
    CONSOLE_SCREEN_BUFFER_INFO con; 
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &con); 
    COORD xy; 
    xy.X = con.dwCursorPosition.X; 
    xy.Y = con.dwCursorPosition.Y; 
    for (int i = 0; i < sRight.length(); i++) 
    { 
     if (sRight[i] == '\n') 
     { 
      xy.Y++; 
      SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), xy);     
      continue; 
     } 
     cout << sRight[i]; 
    } 
    return left; 
} 

然後你只是:

SetConsoleCursorPosition(output_handle, some_COORD); 
cout_coord << "Hi\nthere!"; 

與 「喜」 和 「!有」對於每一個與some_COORD給定的x,都是一個下一個!