这句话将在标准输出上输出“Yousen says "Hello" to Yousen.”
接下来简单说明一下format的用法。估计聪明人都猜到了,在格式化字符串中,“%1%”(不带引号,后称占位符)表示后面跟的第一个参数,“%2%”则表示第二个,以此类推——注意:占位符是从1开始计数,兄弟们别记错了。后面的“%”(当然也不带引号)操作符的意思么……这是format类(千万别把它当作是个函数)重载的操作符,用来替换格式化字符串中的占位符。
刚才说了,format是个类,确切的说format是这样定义的:
看清楚了哦,要想用unicode(宽字符)版的format,就用wformat。
现在来试试format的实例:
#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;
}
输出:
fmt: Hello says "Yousen".
假如已经有一个format对象了,想要改变格式化字符串,调用format::parse方法。如:
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为参数序号,从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