我正在学习如何使用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线程中加入可变参数宏,但它对我不起作用。我可能做错了。
无论如何,我怎么能实现这个目标?
答案 0 :(得分:2)
@massa的答案可以改进:
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);