提供格式化字符串作为参数的现代方法

时间:2016-01-02 16:54:59

标签: c++ string string-formatting

我有一个与std::string formatting like sprintfthis question非常相似的问题,但这些问题非常陈旧,所以我敢于重试以收集一些方法。

我希望有一个函数/方法,它接受定义带有一些变量的格式化字符串的参数,就像printf / sprintf一样。例如,它可以是一个方法send_string(ARGS),它可以格式化并将字符串发送给某个接收者。 E.g:

server->send_message("value1: %d, value2: %0.3f, value3: %s", 2, 3.14, "hello world");

我知道流概念,我知道boost::format。但我不知道最简洁的方法是什么,没有不必要的依赖

以下是我的想法:

  • 使用基于流的方法 - 结果如下:

    server->msg_out() << "value1: " << 2 
                      << ", value2: " << 3.14 
                      << ", value3: '" << "hello world" << "'";
    

    这看起来对我来说最合理,但它非常冗长,很难看出输出会是什么样子。特别是当您尝试实现表格输出或特殊格式的实际值时。从好的方面来说,你没有任何依赖关系。

  • 使用基于C的变量参数。看起来像上面的例子,虽然它被弃用,容易出错并且不灵活,但是众所周知并且使用了很多。

  • 使用Boost.Format

    server->send_message(boost::format(
                "value1: %d, value2: %0.3f, value3: %s") % 2 % 3.14 % "hello world"));
    

    或(以避免API中的依赖项):

    server->send_message(
        boost::str(
            boost::format(
                "value1: %d, value2: %0.3f, value3: %s") % 2 % 3.14 % "hello world")));
    

    似乎是最sprintf - 类似于基于C ++的方法。但我也不喜欢这种方法 - 它非常,它有一种残酷的语法,它也非常冗长,它引入了对Boost的依赖(如果你还没有使用它。

所以目前我会决定采用基于流的方法,但每次使用它时我都会想到:必须有更优雅的东西!

我还没有想到更简单的方法吗?

1 个答案:

答案 0 :(得分:3)

您可能会使用Qt QString::arg函数或从中获取灵感;它有一个格式字符串%1 ... %9但参数是通过arg重载函数给出的,例如

QString str;
long num;
double dbl;
QString outstr = 
 QString("str=%1 num=%2 dbl=%3").arg(str).arg(num).arg(dbl);

因此,通过重载arg进行输入,但格式字符串更加本地化。