我只是好奇是否有可能以某種方式聲明類似於cout的東西,但定義其功能。例如:聲明另一個對象輸出流類似於cout
SetCursorPosition(output_handle, some_COORD);
cout_coord << "Hi\nthere!";
產生這種輸出:
.
Hi
there!
我只是好奇是否有可能以某種方式聲明類似於cout的東西,但定義其功能。例如:聲明另一個對象輸出流類似於cout
SetCursorPosition(output_handle, some_COORD);
cout_coord << "Hi\nthere!";
產生這種輸出:
.
Hi
there!
您可以使用運算符重載,使<<
基本上做任何事情(只是谷歌「C++運算符重載」,你會發現噸的信息),但這樣的事情在你的問題被普遍認爲濫用運算符重載 。重載操作符旨在使代碼更易於閱讀。在C++中,每個人都知道<<
的意思是「輸出內容」,就像+=
的意思是「數學上添加內容」,而=
的意思是「分配內容」。
當我在某段代碼中看到<<
時,我當然不會讀它爲「設置光標位置,然後打印文本」。你可以像這樣實現它,但這是糟糕的編程風格,類似於錯誤的普通函數。
好COUT不是一個函數,它實際上是一個std :: ostream的。您可以創建自己的寫入標準輸出的ostream。
實現此邏輯的方法是創建一個自定義流緩衝區,它在其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&
。任何使用某些模板來重載輸出操作符的嘗試都不會起作用。
這很有趣,但看起來有點複雜,我還沒有完成C++書,我不熟悉你使用的一些函數。我會查找他們,但實際上我找到了我正在尋找的東西,看到我對這個問題的回答。 – Bonnev
感謝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,都是一個下一個!
在C++中,每個人都知道'<<'的意思是「左移」。 –
更好的方式來實現這一點,而不需要與運算符混合在一起,就是創建一個'ostream'包裝器來格式化輸出並顯示允許設置格式化選項的成員函數,或者使用自定義操縱器。根據需要,更簡單的方法就是使用現有的操縱器,比如'width()'和對齊操縱器。 –