我希望我的GUI应用程序通过用户定义的格式和用户选择的变量在屏幕上打印动态数据(鼠标坐标等)。我需要类似存储此格式的类(char*
)及其所有变量指针(int*
,char*
,std::string*
等。)
假设我想要一个工具提示气球来显示鼠标坐标。我的课将是:
class Printer{
private:
char *format;
// std::vector with pointers? Variadic template?
public:
Printer(char *format, ...){
// code
}
};
用户将使用变量定义格式:
int x, y;
Printer p("X (%d), Y (%d)", &x, &y);
鼠标回调函数会更新x
和y
值。
而Printer
会这样做:
snprintf(buffer, sizeof(buffer), format, *variables);
之后,缓冲区包含x
和y
的更新值,可以简单地将其传递给工具提示。
我怎样才能做到这一点?
答案 0 :(得分:1)
我不知道是否可以使用可变参数列表,在C ++ 11之前。
但是从C ++ 11开始,使用可变参数模板(将可变参数列表传递给构造函数)和lambda函数(可以捕获参数引用的可变参数列表),你可以写一些东西为< / p>
class Printer
{
private:
char buffer[1024];
std::string format;
std::function<std::string(void)> l;
public:
template <typename ... Args>
Printer (char const * f0, Args & ... as) : format{f0}
{
l = [&] () -> std::string
{
snprintf(buffer, sizeof(buffer)/sizeof(buffer[0]),
format.c_str(), as...);
return buffer;
};
}
std::string callback () const
{ return l(); }
};
您可以按如下方式使用Printer
int main ()
{
int x{10}, y{20};
Printer p{"X (%d), Y (%d)", x, y};
x = 100;
y = 200;
std::cout << p.callback() << std::endl; // print X (100), Y (200)
}
观察x
和y
作为引用传递,而不是作为指针传递。