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

时间:2009-08-19 05:17:07

标签: c++ string formatting inline log4cxx

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

String.Format(string, params string[]);

返回包含所提供格式和值的新字符串。 C ++中有等价的吗?

原因是因为我正在使用log4cxx并希望利用像

这样的宏
LOG4CXX_DEBUG( logger, expr );

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

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

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

LOG4CXX_INFO( _logger, msg );
由于我必须首先分配和格式化字符串,因此短路逻辑的效率几乎没有。

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

LOG4CXX_DEBUG( _logger, "the price is " + _some-double_);

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

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

再次违背了目的。

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

5 个答案:

答案 0 :(得分:9)

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

LOG4CXX_DEBUG( _logger, "the price is " << price );

答案 1 :(得分:4)

您可以回退到C并使用sprintf

printf(stderr,"The Error(%d) happened(%s)\n",error,errmsg(error));

Boost也有一种格式。

// iostream with boost::format
std::cerr << boost::format("The Error(%d) happened(%s)\n") % error % errmsg(error);

如果你想快捷方式

logger && (std::cerr << Stuff); // Where Stuff can be your boost::format

答案 2 :(得分:3)

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

那就是说,即使存在诸如“string::format”之类的静态函数,我怀疑你会比自己分配一个stringstream对象并操纵它有更多的速度优势,因为静态在任何情况下,函数最有可能在后台执行相同的操作。

答案 3 :(得分:3)

我最喜欢的内联格式化方法是使用boost.format库。例如:

#include <boost/format.hpp>
using namespace boost;

LOG4CXX_INFO( _logger, str(format("cheese it %i, %g") % 1234 % 1.3) );

在日志记录和宏函数中使用变量参数非常方便。

答案 4 :(得分:2)

使用boost格式库或手动编码自己的小版本(如make_string here)。