用printf的风格格式化std::string
一直很偏爱C风格的printf式格式化字符串,清晰而且高效。但是很遗憾C++的std::string并不支持这种格式化方法,只能用丑陋的ostringstream来模仿:
std::ostringstream os; os << "Hello test " << someint << ' ' << somestring; std::string buffer(os.str());
不过我们可以自己写一个:
#include <stdio.h> #include <stdarg.h> std::string format(const char *fmt, ...) { va_list ap; va_start(ap, fmt); const size_t SIZE = 512; char buffer[SIZE] = { 0 }; vsnprintf(buffer, SIZE, fmt, ap); va_end(ap); return std::string(buffer); }
原理很简单,vsnprintf可以直接使用变长变量列表来格式化字符串,我们只需要提供一个返回std::string的变长变量函数,然后使用vsnprintf来进行格式化操作即可。
当然还有几个小问题:buffer是固定字长的,会截断结果;返回的std::string需要对buffer进行一次复制,略有效率损失。