Это может быть глупый вопрос, но я дам ему шанс.Методы Ncurses и ostream класса?
Есть ли способ иметь метод класса, который принимает объект ostream в качестве вывода параметра в окно Ncurses?
Это может быть глупый вопрос, но я дам ему шанс.Методы Ncurses и ostream класса?
Есть ли способ иметь метод класса, который принимает объект ostream в качестве вывода параметра в окно Ncurses?
Во-первых, мы должны использовать std :: streambuf. Вот очень простой пример, который просто перенаправляет зЬй :: 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 world\n";
{
ncurses_stream foo(std::cout);
std::cout << "hello world\n";
}
std::cout << "back to original state\n";
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 world\n";
refresh();
sleep(5);
endwin();
return 0;
}
Большое спасибо Джошу, это решает так много головных болей –
Какова конкретная проблема, которую вы испытываете? Но да, я уверен, что есть способ сделать это. Тем не менее, я ничего не знаю о ncurses. – 0x499602D2
У меня есть огромная иерархия классов, которая имеет функции печати для каждого класса с прототипом: Print (ostream & out); Я хотел бы как-то вызвать функцию, а вывод в окне Ncurses - это ostringsream, рассматриваемый как ostream? может называть его передачей в строковом потоке, а затем использовать stringstream для создания строки и использовать ее с функцией printw ncurses. Кажется, что LOT дополнительной работы, хотя ... –
Как вы получаете доступ к окну ncurses из вашей программы на C++? Возможно, вы сможете перенаправить вывод из объекта 'std :: ostream'. – 0x499602D2