boost::format

实在不好意思,原本计划每天一篇,这几天工作遇到问题,只好改为“不定期”一篇,  调皮
今天是format library,其实N天前我已经看过了,也动手实验了一下,现在才来把笔记补上。
用过MFC或ATL中的CString的人一定知道CString::Format方法,比起CRT中的sprintf来,CString的Format就显得“安全”和易用多了:不需要算好字符串最大长度来分配接收的内存空间,只要是sprintf支持的数据类型,都可以格式化成字符串,性能么——偶不知道。然而,若想用CString,不用MFC也得带上ATL,悲惨那~
不废话了,晚上还要洗澡&早点睡觉,直接奔主题!
boost库提供了format库来完成比CString::Format更酷的任务。不知道有多少人用过.NET中的String.Format,boost提供的format跟这个相当:只需要在格式化字符串中指定位置和参数序号,不需要指定什么类型,而且原则上只要实现了流操作的类型都支持!
下面具体点,举个例子:

cout << format( "%1% says \"%2%\" to %1%.\n" ) % "Yousen" % "Hello";

这句话将在标准输出上输出“Yousen says "Hello" to Yousen.”
接下来简单说明一下format的用法。估计聪明人都猜到了,在格式化字符串中,“%1%”(不带引号,后称占位符)表示后面跟的第一个参数,“%2%”则表示第二个,以此类推——注意:占位符是从1开始计数,兄弟们别记错了。后面的“%”(当然也不带引号)操作符的意思么……这是format类(千万别把它当作是个函数)重载的操作符,用来替换格式化字符串中的占位符。
刚才说了,format是个类,确切的说format是这样定义的:

typedef basic_format<char> format;

看清楚了哦,要想用unicode(宽字符)版的format,就用wformat。

typedef basic_format<wchar_t> wformat;

现在来试试format的实例:

#include <boost/format.hpp>
#include <iostream>
#include <string>

using namespace std;
using namespace boost;

int main()
{
 format fmt( "%2% says \"%1%\"." );
 fmt % "Yousen";
 fmt % "Hello";
 string str = fmt.str();
 cout << "string from fmt: " << str << endl;
 cout << "fmt: " << fmt << endl;
}

输出:

string from fmt: Hello says "Yousen".
fmt: Hello says "Yousen".

假如已经有一个format对象了,想要改变格式化字符串,调用format::parse方法。如:

format fmt;
fmt.parse( "%1% %2%" );

在获取fmt输出之前,若是参数不足或者多余格式化字符串所指定的数量,则可能会抛出下列异常:
bad_format_string
too_few_args
too_many_args
out_of_range
这些都是format_error类的派生类,format_error则派生于std::exception类。
上面举例的format格式字符串都是非常简单的。format实际上提供了非常强大的格式化控制。这是格式化字符串中占位符的完整语法:

[ N $ ] [ flags ] [ width ] [ . precision ] type-char

其中N为参数序号,从1开始计数;flags是格式控制标志;width为格式化输出宽度,.precision为显示小数点后面位数;type-char为输出类型控制符——除了序号,其他内容和printf中的一样。不罗嗦了。自己看后面的参考站点。
注意前面有个%,如果用简单模式(仅表示参数序号),后面也得跟上一个%。
除此之外,format也兼容prinf风格格式化字符串,但是不能和format自己的格式化字符串混用。如“%s says %2%”这样是不行滴,运行时会抛出异常。还有,在使用printf风格字符串时,所有跟进的参数都将顺序替换占位符。
最后一点是关于用户自定义类的格式化,原则上,只要定义了相应的流输出(operator<<(std::ostream,...))操作符,就能够被format所支持。而且假如指定了详细的格式,format则会尽可能的去实现。也不罗嗦了,洗澡睡觉!

其他详细情况则参考:http://www.boost.org/libs/format/doc/format.html
对了,还有一件很重要的事情忘了说:大家如果觉得有什么问题的,跟帖;如果发现错误的,跟帖。共同进步哦!
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值