C++内联字符串格式和数字转换

5 c++ string formatting inline log4cxx

C#有一个很好的静态方法

String.Format(string, params string[]);
Run Code Online (Sandbox Code Playgroud)

返回一个新字符串,其中包含提供的格式和值.C++中有等价的吗?

原因是因为我正在使用log4cxx并希望利用像这样的宏

LOG4CXX_DEBUG( logger, expr );
Run Code Online (Sandbox Code Playgroud)

使用短路评估,以便在未启用日志级别DEBUG时永远不会评估expr.

目前,在C++中,我这样做:

CString msg;
msg.Format( formatString, values... );

LOG4CXX_INFO( _logger, msg );
Run Code Online (Sandbox Code Playgroud)

由于我必须首先分配和格式化字符串,因此短路逻辑的效率几乎没有.

尝试使用数值进行简单记录时会出现类似问题.这个,不会编译:

LOG4CXX_DEBUG( _logger, "the price is " + _some-double_);
Run Code Online (Sandbox Code Playgroud)

所以我最终不得不写这样的东西:

CString asStr;
asStr.Format( "%d", _some-double_ );
LOG4CXX_DEBUG( _logger, "the price is " + asStr );
Run Code Online (Sandbox Code Playgroud)

这又失败了.

我不是一个C++专家,所以我希望有更多知识渊博的人可以提供帮助.

On *_*und 9

log4cxx接受类似参数的流,因此您可以编写,例如:

LOG4CXX_DEBUG( _logger, "the price is " << price );
Run Code Online (Sandbox Code Playgroud)


GRB*_*GRB 3

使用标准库,如果您没有某种类型的内存分配,就无法生成格式化字符串。C++string类本身没有“格式”函数,因此您必须使用stringstream对象来连接数字和文本,但这将涉及分配对象。看看像 之类的 C 函数sprintf,您需要char预先分配一个数组,因为sprintf它本身不分配任何内存。

也就是说,即使存在诸如“ string::format”之类的静态函数,我怀疑与自己分配对象并操作它相比,您是否会获得很大的速度优势stringstream,因为静态函数很可能在后台执行相同的操作任何事件。