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

fra*_*ans 5 c++ string string-formatting

我有一个与std::string 格式非常相似的问题,例如 sprintf这个问题,但这些问题非常旧,所以我敢于重试以收集一些方法。

我想要一个函数/方法,它接受参数来定义带有一些变量的格式化字符串,很像printf/ sprintf。例如,它可以是一种send_string(ARGS)格式化字符串并将其发送到某个接收者的方法。例如:

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

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

这是我的想法:

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

    server->msg_out() << "value1: " << 2 
                      << ", value2: " << 3.14 
                      << ", value3: '" << "hello world" << "'";
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 使用基于 C 的变量参数。看起来就像上面的例子,尽管它已被弃用、容易出错且不灵活,但它是众所周知的并且被大量使用。

  • 使用Boost.Format

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

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

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

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

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

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

Bas*_*tch 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);
Run Code Online (Sandbox Code Playgroud)

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