C++ 如何包装ncurses';s printw函数?

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.

我正在学习如何使用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);
我查看了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);
}
进一步阅读:

  • 课程手册页面中的注释

寻找“可变模板”,或者更好的做法是,将您的CWindow类作为一种iostream类,并使用插入器和提取器(
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);
}