存储snprintf参数供以后使用

时间:2018-05-03 05:36:43

标签: c++ templates printf variadic-templates variadic-functions

我希望我的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);

鼠标回调函数会更新xy值。 而Printer会这样做:

snprintf(buffer, sizeof(buffer), format, *variables);

之后,缓冲区包含xy的更新值,可以简单地将其传递给工具提示。

我怎样才能做到这一点?

1 个答案:

答案 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)
 }

观察xy作为引用传递,而不是作为指针传递。