2013-11-21 3 views
2

Это может быть глупый вопрос, но я дам ему шанс.Методы Ncurses и ostream класса?

Есть ли способ иметь метод класса, который принимает объект ostream в качестве вывода параметра в окно Ncurses?

+0

Какова конкретная проблема, которую вы испытываете? Но да, я уверен, что есть способ сделать это. Тем не менее, я ничего не знаю о ncurses. – 0x499602D2

+0

У меня есть огромная иерархия классов, которая имеет функции печати для каждого класса с прототипом: Print (ostream & out); Я хотел бы как-то вызвать функцию, а вывод в окне Ncurses - это ostringsream, рассматриваемый как ostream? может называть его передачей в строковом потоке, а затем использовать stringstream для создания строки и использовать ее с функцией printw ncurses. Кажется, что LOT дополнительной работы, хотя ... –

+0

Как вы получаете доступ к окну ncurses из вашей программы на C++? Возможно, вы сможете перенаправить вывод из объекта 'std :: ostream'. – 0x499602D2

ответ

3

Во-первых, мы должны использовать 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; 
} 
+0

Большое спасибо Джошу, это решает так много головных болей –

Смежные вопросы