C++ 如何包装ncurses';s printw函数?
我正在学习如何使用ncurses,并希望使用RAII自动初始化和结束窗口:C++ 如何包装ncurses';s printw函数?,c++,ncurses,C++,Ncurses,我正在学习如何使用ncurses,并希望使用RAII自动初始化和结束窗口: class CWindow { public: CWindow() {initscr();} ~CWindow() {endwin();} }; 这是CWindow类的基本思想。它现在只适用于stdscr,因此使用addch()、printw()等函数不是问题。但是,此类最终将用于表示ncurses窗口(WINDOW*)。直观的做法是添加诸如print之类的成员函数,这样就不用使用 wprintw(win.
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);
我查看了web,但在我看来,只有cstdio的prinf和类似的函数被包装。cstdio提供了一种简单的方法,它具有接受va_列表的函数。但是,ncurses没有这组函数
说实话,我更喜欢C++,而不是C,所以我的C知识不太好。我还没有创建任何变量参数列表函数。我尝试过天真的方法:
void print(const char* str, ...)
{
va_list args;
va_start(args, str);
printw(str, args);
va_end(args);
}
但是,它不起作用。我还尝试将可变宏像线程一样合并到线程中,但它对我不起作用。不过我可能做错了
不管怎样,我该如何做到这一点呢?你几乎走上了做你想做的事情的正确道路,只要改变就行了
printw(string, args);
为了
@massa的答案可以改进:
- 虽然ncurses接受
,但首选形式是vwprintw
vw\u printw
- 无需使用
中的返回值;initscr
变量保持相同的值stdscr
void print(const char* str, ...)
{
va_list args;
va_start(args, str);
vw_printw(stdscr, str, args);
va_end(args);
}
进一步阅读:
- 课程手册页面中的注释
operator
)……我也见过可变模板,但他们说可变模板将为每一组参数创建单独的函数(因为模板就是这样工作的). 因此,关于代码大小,它是无效的。我还考虑了操作符>,但我想保持界面的一致性,我想使用函数mvprintw(const char*str,…),它将光标移动到(y,x),然后在那里打印str。经过充分的优化,您的可变模板调用应该内联到原始的mvprintw
或printw
调用,并且该问题没有意义。不管怎样,请看下面我的答案…编辑:好的;它实际上是vwprintw;printw没有它的v函数。。。感谢您的回答。vw_printw返回一个带有OK或ERR的int,这可能有助于此打印函数将其包装为返回。
void print(const char* str, ...)
{
va_list args;
va_start(args, str);
vw_printw(stdscr, str, args);
va_end(args);
}