如何包装ncurses的printw函数?

时间:2014-04-05 11:03:34

标签: c++ ncurses

我正在学习如何使用ncurses,并希望使用RAII自动初始化和结束窗口:

class CWindow
{
public:
   CWindow() {initscr();}
   ~CWindow() {endwin();}
};

这是CWindow类的基本思想。它现在只适用于stdscr,因此使用addch(),printw()等函数不是问题。但是,这个类最终将用于表示ncurses窗口(WINDOW *)。添加像print这样的成员函数是很直观的,所以不要使用

wprintw(win.getWin(), "str %i", someVar);

可以写

win.print("str %i", someVar);

我查看了网络,但在我看来,只有cstdio的prinf和类似的功能已被包装。 cstdio提供了一种简单的方法,其功能可以接受va_list。但是,ncurses没有这套功能。

老实说,我宁愿使用C ++然后使用C语言,所以我的C知识并不出色。我还没有创建任何变量参数列表函数。我试过天真的方法:

void print(const char* str, ...)
{
    va_list args;
    va_start(args, str);
    printw(str, args);
    va_end(args);
}

然而,它不起作用。我也尝试在this线程中加入可变参数宏,但它对我不起作用。我可能做错了。

无论如何,我怎么能实现这个目标?

2 个答案:

答案 0 :(得分:2)

@massa的答案可以改进:

  • 当ncurses接受vwprintw时,首选表单为vw_printw
  • 没有必要使用initscr的返回值; stdscr变量保持相同的值。

有了这些修正:

void print(const char* str, ...)
{
    va_list args;
    va_start(args, str);
    vw_printw(stdscr, str, args);
    va_end(args);
}

进一步阅读:

答案 1 :(得分:0)

你几乎是在正确的道路上做你想做的事情,只需改变

printw(string, args);

WINDOW *win = initscr();
// ...
vwprintw(win, string, args);