Ncurses和ostream类方法

Ncurses and ostream class method?

本文关键字:类方法 ostream Ncurses      更新时间:2023-10-16

这可能是个愚蠢的问题,但我会试一试。

有没有一种方法可以让类方法将ostream对象作为参数输出到Ncurses窗口?

首先,我们应该利用std::streambuf。这里有一个非常简单的例子,它只是将std::cout重定向到一个简单的打印机

#include <streambuf>
#include <iostream>
class ncursesbuf: public std::streambuf {
public:
  ncursesbuf() {}
  virtual int overflow(int c) {
    printf("'%d'n", c);
  }
};
class ncurses_stream : public std::ostream {
public:
  ncursesbuf tbuf_;
  std::ostream &src_;
  std::streambuf * const srcbuf_;
  ncurses_stream(std::ostream &o) : src_(o), srcbuf_(o.rdbuf()), std::ostream(&tbuf_) {
    o.rdbuf(rdbuf());
  }
  ~ncurses_stream() {
    src_.rdbuf(srcbuf_);
  }
};
int main(int argc, char **argv) {
  std::cout << "hello worldn";
  {
    ncurses_stream foo(std::cout);
    std::cout << "hello worldn";
  }
  std::cout << "back to original staten";
  return 0;
}

然后我们可以修改它以使用ncurses

#include <streambuf>
#include <ncurses.h>
#include <iostream>
class ncursesbuf: public std::streambuf {
public:
  ncursesbuf() {}
  virtual int overflow(int c) {
    printw("%c", c);
  }
};
class ncurses_stream : public std::ostream {
public:
  ncursesbuf tbuf_;
  std::ostream &src_;
  std::streambuf * const srcbuf_;
  ncurses_stream(std::ostream &o) : src_(o), srcbuf_(o.rdbuf()), std::ostream(&tbuf_) {
    o.rdbuf(rdbuf());
  }
  ~ncurses_stream() {
    src_.rdbuf(srcbuf_);
  }
};
int main(int argc, char **argv) {
  /* ncurses setup */
  initscr();
  ncurses_stream foo(std::cout);
  std::cout << "hello worldn";
  refresh();
  sleep(5);
  endwin();
  return 0;
}