惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
人人都是产品经理
人人都是产品经理
V
Visual Studio Blog
Last Week in AI
Last Week in AI
V
V2EX
博客园_首页
IT之家
IT之家
Jina AI
Jina AI
博客园 - 叶小钗
The Cloudflare Blog
T
Tailwind CSS Blog
腾讯CDC
B
Blog
D
Docker
L
LangChain Blog
博客园 - 司徒正美
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI

博客园 - 小峰

反思下 [.net] 将 datatable 存储到数据库 - 小峰 要上班了 表达式模版学习笔记 模版元编程学习笔记 模版默认参数小探 boost serialization 试用 套接字 io 模型 小结 精简版 rtti class 能不能这么写 类成员变量私有化 设计模式小结 接口版本演化引发的思考二 c# 程序最小化到系统托盘 [xna]帧数 皆是#惹的祸 [xna]键盘 代码片段 单元测试
boost/format试用
小峰 · 2006-12-04 · via 博客园 - 小峰

   下面这段程序是c#中如何进行字符串格式的代码片段:

1            Console.WriteLine(string.Format("{0} is {1} is {2}"1"dxfcv222"123.45678f));
2

   大家可以看到,简单明了非常好用。format函数甚至允许多个位置采用相同的参数,比如:

1            Console.WriteLine(string.Format("{0} is {1} is {1}"1"dxfcv222"123.45678f));
2

   

   在c++中串格式化函数就没那么好用了。下面给出一段c++中进行串格式化的代码:

1    char buffer3[256];
2    sprintf(buffer3, "%5d is % 5.6s is %-7.2f"1"1234567"12.34567);
3    cout << buffer3 << endl;
4

    大家可以看到,这样一段代码,其实问题是很多的。1。我们申请了一个缓冲区,其大小是256,该缓冲区如果开大了造成资源浪费,如果开小了那肯定会异常,多么头疼的问题。2。无法在编译期检测出格式化串输入错误问题,比如我们把"%5d is % 5.6s is %-7.2f"错输入为"%5a is % 5.6s is %-7.2f"这个错误只有在程序崩溃的时候才能够暴露出来。3。易用性不好。

   为此,我写了个格式化串的类FormatString,其出发点就是在c++中模拟c#中串格式化语法,减少出错可能性,提高易用性。其典型使用代码片段如下:

1string buffer = FormatString("scene\\{0}.ini"<< serial << OVER;

   缺点是效率不高,能处理的情况也很有限(只能处理基本数据类型)  。无法设置参数格式化精度和输出样式(比如左对齐,局中对齐等),字符填充等。

   下面向大家介绍我们今天的明星,boost/format~~~~~~~~~~~~~~~~~~~~~`。
   format 类型是boost库中包含的一个用来格式化串的类型。该类型兼容了c风格的
   串格式化格式,同时也提供了一套更加直观的boost 风格的串格式化格式。另外该类型提供了一些printf()函数不支持的特性,比如输入参数局中显式,用户自定义类型格式化输出等。下面给出部分使用代码片段:

1  //c 风格的格式化。
2    cout << format("%5d is % 5.6s is %-7.2f"% 1 % "1234567" % 12.34567 << endl;
3

1    //boost 风格格式化。
2    cout << format("%1% is %2% is %3%"% 1 
3                                        % 1.234f 
4                                        % "dxfcv222" << endl;

   有兴趣的朋友可以到 boost 网站查询关于 format 类型的更多信息。网址如下:
   http://www.boost.org