Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 提供格式化字符串作为参数的现代方法_C++_String_String Formatting - Fatal编程技术网

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

C++ 提供格式化字符串作为参数的现代方法,c++,string,string-formatting,C++,String,String Formatting,我有一个与or非常相似的问题,但这些问题已经很老了,所以我敢尝试收集一些方法 我想要一个函数/方法,它接受一些参数,这些参数用一些变量定义格式化字符串,就像printf/sprintf。例如,它可以是一个方法send\u string(ARGS),该方法将格式化字符串并将其发送给某个接收方。例如: server->send_message("value1: %d, value2: %0.3f, value3: %s", 2, 3.14, "hello world"); 我知道流的概念,也

我有一个与or非常相似的问题,但这些问题已经很老了,所以我敢尝试收集一些方法

我想要一个函数/方法,它接受一些参数,这些参数用一些变量定义格式化字符串,就像
printf
/
sprintf
。例如,它可以是一个方法
send\u string(ARGS)
,该方法将格式化字符串并将其发送给某个接收方。例如:

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" << "'";
    
    或者(为了避免API中的依赖项):

    这似乎是最“<代码> SpRtff”——类似C++的方法。但是我也不喜欢这种方法——它的速度非常慢,语法非常残酷,也非常冗长,并且引入了依赖性来增强(如果您还没有使用它的话)

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


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

您可能会使用Qt函数,或者从中获得灵感;它的格式字符串为
%1
<代码>%9但参数是通过
arg
重载函数给出的,例如

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

<> P>是通过重载<代码> ARG< /COD> >,但是格式字符串更本地化友好。

我认为C++中的格式说明符是不必要的和不好的。看看
std::cout
是如何做到的。使用模板。C++是先进的,以避免类型不安全的东西,像这样。我认为是一个稍微更新版本的旧副本。它提到了在标准中包含一个新的
std::putf
函数的建议;但我认为这一建议尚未被任何未来的标准修订版所接受。@cad用于格式化的io操纵器的问题在于,这些操纵器不适合输出格式的国际化。你知道,可能需要不同的格式规范,因为单词在不同的语言中会改变它们的位置。+实现一个可用于s.th的类似乎并不简单。坦率地说,就像
server->msg_out(),我只接受
std::string
。然后用户可以按照自己的意愿进行组装。当您已经使用Qt时,这是一个选项。在我的示例中,生成的命令是
server->send_message(QString(“value1:%d,value2:%0.3f,value3:'%s')).arg(2).arg(3.14).arg(“hello world”)这是可以接受的冗长,但您当然需要量化您的API。正如我所说,您也可以从该方法中获得灵感
server->send_message(
    boost::str(
        boost::format(
            "value1: %d, value2: %0.3f, value3: %s") % 2 % 3.14 % "hello world")));
QString str;
long num;
double dbl;
QString outstr = 
 QString("str=%1 num=%2 dbl=%3").arg(str).arg(num).arg(dbl);